0

バックグラウンドでログ ファイルを読み込んで、テキストを更新しようとしています QTextEdit。以下はコードです。しかし、信号を送信すると、UI がフリーズします。ここでQtConcurrentで間違っていることを誰かが指摘できますか?

信号をスロットに接続します

connect(this, SIGNAL(SignalUpdateLog(QString)),this,SLOT(SlotUpdateLog(QString)));

ログ ボタン イベントの更新

void on_ButtonClicked()
{
   ...
   //Show busy dialog
   QtConcurrent::run(this, &ClassA::UpdateReaderLog);
 }

バックグラウンド タスク

void ClassA::UpdateReaderLog()
{

    QFile file("/home/Debug.txt");
    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(&file);
        in.setCodec("UTF-8");
        while (!file.atEnd())
        {
          emit SignalUpdateLog(in.readLine());
        }

        emit SignalUpdateLog("finishedReadingFile");
        qWarning("\nRead finished");

    }
    else
    {
        //! emit signal to show failure pop up
    }
}

スロット

void ClassA::SlotUpdateReaderLog(QString str)
{

    if(str.contains("finishedReadingFile"))
    {
        qWarning("\nSetting reader screen");
        SetToScreen(SCREEN__READER_LOG);

        //Close the busy dialog
    }
    else
    {
        ui->textEditReaderLog->append(str);
    }
}

編集: ファイルのオープンに失敗した場合に UpdateReaderLog() からポップアップを表示するシグナルを送信するように変更

4

2 に答える 2

2

最初にスレッドとイベント ループをお読みください。

while (!file.atEnd())
{
  emit SignalUpdateLog(in.readLine());
}

このwhile(!file.atEnd())ループでシグナルを継続的に発信していますが、イベント ループはこれらのシグナルを処理して目的のオブジェクトに送信する機会がありません。このビジー ループのために UI が描画されていないため、UI がフリーズします。

別の問題は、スロットが間違ったスレッドで呼び出されていることです。3 番目の引数としてQt::connectシグナルを送信する必要があります。Qt::QueuedConnection問題を解決するかもしれませんが、デザインの選択に注意してください。

于 2016-05-04T05:10:28.670 に答える
0

シグナルスロットを Qt::QueuedConnection に接続します。マルチスレッドでは、実際の状況に応じて異なるタイプのシグナルスロットを接続する必要があります。

于 2016-05-04T03:12:41.667 に答える