2017-07-09 1 views
-1

私は現在QDBusで始まっています。私は配列のいくつかの計算を行い、後でそれを送り返すことになっている別のprogrammにint配列のデータを送信しようとしています。QDBus send int []

私はintとして、配列の開始アドレスを送信してみました。 私は、ここでの問題は、私の値段のコピーを何とか送って、私の他のプロゴラムが彼のものではない記憶を混乱させないようにしなければならないということです。このコードから

sessionBus is connected... 
Starting line conversion... 
Done converting... 
Data at: -1077790240 
Reply invalid: Message recipient disconnected from message bus without replying 
Starting line conversion... 
Done converting... 
Data at: -1077790240 
Reply invalid: The name domain.comSim was not provided by any .service files 
Starting line conversion... 
Done converting... 
Data at: -1077790240 
Reply invalid: The name domain.comSim was not provided by any .service files 

私は現在、このデバッグ出力を取得しています

void MainWindow::on_btnSend_clicked() 
{ 
    if (!QDBusConnection::sessionBus().isConnected()) 
    { 
     qDebug() << "Cannot connect to the D-Bus session bus.\r\n"; 

     return; 
    } 

    qDebug() << "sessionBus is connected...\r\n"; 

    QDBusInterface iface(SERVICE_NAME, "/", "", QDBusConnection::sessionBus()); 

    if (iface.isValid()) 
    { 
     int height = this->image->height(); 
     int width = this->image->width(); 

     for(int lineCounter = 0; lineCounter < height; lineCounter++) 
     { 
      qDebug() << "Starting line conversion...\r\n"; 

      QRgb* lineValues = (QRgb*)this->image->scanLine(lineCounter); 

      /* 

      QList<QVariant> args; 

      args << QVariant::fromValue(width); 

      for(int pixelCounter = 0; pixelCounter < width; pixelCounter++) 
      { 
       args << QVariant::fromValue(qAlpha(lineValues[pixelCounter])); 
       args << QVariant::fromValue(qRed(lineValues[pixelCounter])); 
       args << QVariant::fromValue(qGreen(lineValues[pixelCounter])); 
       args << QVariant::fromValue(qBlue(lineValues[pixelCounter])); 
       ] 
      }*/ 


      int values[width][4]; 

      for(int c = 0; c < width; c++) 
      { 
       values[c][0] = qAlpha(lineValues[c]); 
       values[c][1] = qRed(lineValues[c]); 
       values[c][2] = qGreen(lineValues[c]); 
       values[c][3] = qBlue(lineValues[c]); 
      } 

      qDebug() << "Done converting...\r\n"; 
      qDebug() << "Data at: " << (int)values << "\r\n"; 

      QDBusReply<int> reply = iface.call("processLine", (int)values, width); 

      if (!reply.isValid()) 
      { 
       qDebug() << "Reply invalid: " << qPrintable(reply.error().message()) << "\r\n"; 
      } 
     } 
    } 
    else 
    { 
     qDebug() << "Interface is invalid: " << qPrintable(QDBusConnection::sessionBus().lastError().message()); 
    } 
} 

あなたは私もQVariantsのリストに私の値をボックスにトライを参照して送信しようとしたようにこれはcallWithArgumentList経由ですが、これらの呼び出しを処理するシグネチャを記述する方法の例は1つも見つかりませんでした。彼のスロットをエクスポート

現在、私のクラスには、次のようになります。

class Simulation : public QObject 
{ 
    Q_OBJECT 

public slots: 
    Q_SCRIPTABLE int processLine(int dataPtr, int length); 
}; 

と、このような「processLine」:

印刷後にクラッシュ
int Simulation::processLine(int dataPtr, int length) 
{ 
    //int values[length][4]; 
    int** values = (int**)dataPtr; 

    cout << "Data should be at: " << dataPtr << endl; 

    cout << "Should start printing pixel values now:" << endl; 

    for(int c = 0; c < length; c++) 
    { 
     cout << "Pixel #" << c << ": Alpha:" << values[c][0] << " Red:" << values[c][1] << " Green:" << values[c][2] << " Blue:" << values[c][3] << endl; 
    } 

    return dataPtr; 
} 

「今すぐ印刷ピクセル値を起動する必要があります」。

だから私のメインの質問は、この問題に取り組むために、右と最小限の方法は、([] DBUSを経由してINTを送ること)は何かありますか?

挨拶、 ロビン

+0

:一つのことは、私は今、次のコードですべてのデータを送信することができる午前QVariant

を含めるでしたか? Cスタイルの配列は非常に多くの方法で厄介な..です –

+0

私はQListにして試してみたし、呼び出すことができませんでした「と呼んで」もうそこに原因QVariantが行方不明にいくつかの変換のようでした。しかし、ベクトルでそれを試してみよう –

+0

同じことiface.callは、リモートメソッドに渡すためのパラメータとしてQVariantを受け入れるだけで、悲しいことにQVariantへのベクトルには暗黙の変換はありません –

答えて

0

あなたは非常に簡単でしたソリューションに精通していない何かを開始しているとき、それは最も可能性がありますとおり。あなただけの `のstd :: vector`または` QVector`を送信しないのはなぜ

if (iface.isValid()) 
    { 
     int height = this->image->height(); 
     int width = this->image->width();   

     QImage* recvImage = new QImage(width, height, QImage::Format_ARGB32); 

     for(int lineCounter = 0; lineCounter < height; lineCounter++) 
     { 
      qDebug() << "Starting line conversion...\r\n"; 

      QRgb* lineValues = (QRgb*)this->image->scanLine(lineCounter); 

      QList<int> values; 

      for(int c = 0; c < width; c++) 
      { 
       values.append(lineValues[c]); 
       //values.append(qAlpha(lineValues[c])); 
       //values.append(qRed(lineValues[c])); 
       //values.append(qGreen(lineValues[c])); 
       //values.append(qBlue(lineValues[c])); 
      } 

      QVariant arg; 
      arg.setValue(values); 

      QDBusReply<QList<int> > reply = iface.call("processLine", arg); 

      if (!reply.isValid()) 
      { 
       qDebug() << "Reply invalid: " << qPrintable(reply.error().message()) << "\r\n"; 
      } 

      QList<int> recvValues = reply.value(); 
      QRgb* recvLineValues = (QRgb*)recvImage->scanLine(lineCounter); 

      for(int c = 0; c < width; c++) 
      { 
       //int alpha = recvValues.at(4*c); 
       //int red = recvValues.at(4*c); 
       //int green = recvValues.at(4*c); 
       //int blue = recvValues.at(4*c); 
       //recvLineValues[c] = qRgba(red, green, blue, alpha); 
       recvLineValues[c] = recvValues.at(c); 
      } 

      QGraphicsScene* scene = new QGraphicsScene(); 
      QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(*(this->image))); 

      scene->addItem(item); 

      ui->gViewRecvImage->setScene(scene); 
      ui->gViewRecvImage->show(); 

     } 
    }