1

テーブルを表示したり、データを計算したりする QWidget TableView クラスがあります...

そのコストラクタ内で、クラスの FortuneServer サーバーを起動します。

FortuneServer::FortuneServer(QObject *parent)
    : QTcpServer(parent)
{
...

このクラスは、FortuneServer::incomingConnection で次のような新しいスレッドを開始します。

FortuneThread::FortuneThread(int socketDescriptor, const QString &fortune, QObject     *parent)
: QThread(parent), socketDescriptor(socketDescriptor), text(fortune)
{
}

void FortuneThread::run()
{
    QTcpSocket tcpSocket;
    if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocket.error());
        cout<<"socket error"<<endl;
        return;
    }
    tcpSocket.waitForReadyRead(10000);
    // this where sockets opens and waits for incoming data...

私は次のことをする必要があります:

  1. クライアントからこのスレッドで取得した文字列を、別の文字列を計算してこのスレッドに戻し、クライアントに送信する TableView クラス内の関数に接続する必要があります。

  2. スレッドからの発行を使用する場合、スレッドに結果を待機させるにはどうすればよいですか?

これはどのように正しく行われますか?

タイ

4

2 に答える 2

3

ネットワーク上のソースからバイトを読み取る場合、次のことができます。

1- 固定長のバイナリ メッセージを使用します。したがって、バイトのブロックが読み取られるのを待って、それに対して必要なことは何でも行うことができます。2- メッセージを区切るために区切り文字を使用する文字列ベースのプロトコルを使用します。区切り文字が表示されたら、新しい収入メッセージを抽出する必要があります。3- Content Length のようなものを使用して、何バイトが来て、読み取る必要があるかを確認します。

slotQt では、Calledクラスに が必要です。同様signalに、Callerクラスにもあります。新しい文字列が到着すると(どのような方法を使用しても)、シグナルを送信するだけで、呼び出されたクラスに通知されます。メソッドを使用connect()してスロットを信号に接続する必要があります。新しいデータが利用可能になったときにシグナルを提供する readyRead() という名前のシグナルQIODeviceを持っているのは親だと思います。QTcpSocket

コンストラクターで例外をスローする可能性のある操作を実行しないでください。別の方法でコンストラクターからサーバーを作成して起動することをお勧めします。

于 2012-06-10T03:16:39.507 に答える
2

これを行う最善の方法は、別のスレッドを開始するのではなく、socketDescriptor int を QSocketNotifier オブジェクト (タイプ QSocketNotifier::Read) に渡して、QSocketNotifier の activate(int) シグナルを GUI のスロットに接続することだと思います。クラス。次に、バイトがネットワークから読み取り可能になるたびに、スロットがメインスレッドで呼び出され、スレッド間のメッセージングやシグナリングまたはブロックの問題に取り組むことなく、メインスレッドでそれらを読み取って処理できます。その方がはるかに簡単です:)

于 2012-06-10T03:22:45.377 に答える