Qtに非常に大きな(〜1Gb)ファイルを読み取り、QTcpSocketを介してデータをリクエスターに返すWebサーバーがあります。このソケットは、メインサーバースレッドによって作成されます。QtConcurrentを使用して、このソケットをワーカースレッドに渡し、そこにデータを送り返したいと思います。
// Using QtConcurrent
BackgroundConcurrent childThreadToReturnLotsOfData;
QFuture<void> futureObject = QtConcurrent::run(&childThreadToReturnLotsOfData, &BackgroundConcurrent::returnPartialLargeFile, resp , &fileToCheckExistence);
'returnPartialLargeFile'関数は次のようになります。
void BackgroundConcurrent::returnPartialLargeFile( QHttpResponse *resp , QFile *fileToCheckExistence ) const
{
// We need an event loop for the QTCPSocket slots
QEventLoop loop;
//QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
// Execute our event loop
//loop.exec();
// To do this in another thread from the one created, you must
// move that socket to this thread, reparent and move
resp->m_connection->m_socket->setParent( 0 );
resp->m_connection->m_socket->moveToThread( QThread::currentThread() );
// Read in chunks until we have sent all data back to the requestor
QByteArray dataToWriteToSocket; // Store the data to send back
while ( dataReadFromFileInBytes > 0 ) {
// Read some Data into the byte array
// Write each chunk to the socket
resp->write(dataToWriteToSocket); // <----- Here is our data from the content of the file
resp->flushData(); // <----- Flush data to the socket
}
// End our response and close the connection
resp->end();
return;
}
私が得るエラーは、'loop.exec()'行をコメントアウトしたままにすると、次のエラーが発生することです。
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread c2630. Receiver '' (of type 'QTcpServer') was created in thread 910a8", file kernel/qcoreapplication.cpp, line 501
コメントを外すと、ここでの関数はexec()行で短絡し、ソケットにデータを書き込んだりデータを書き込んだりすることはありませんが、エラーは発生しません。whileループからのデータを含まない切り捨てられた応答を取得するだけです。 。
ソケットの親を変更して新しいスレッドに移動しているので、問題がイベントループとソケットの信号とスロットだけにあることを願っています。私がここで間違っていることについて何か考えはありますか?どうすればこれを機能させることができますか?信号/スロットの問題が発生した場合、ここで接続する必要があるのはどれですか?ありがとう -