一直聽擔心一個問題,Qt中的信號如果觸發的太快,槽這邊都來不及執行完自己的任務,后面的信號又開始觸發了,會出現什么現象,
以前在寫單片機的中斷服務函數時,單片機有中斷嵌套,
下面是在qt creator下面寫的一個測試例子:HANDLE h_thread_func_invoke_signal;bool g_b_flag_thread_running;
unsigned int count = 0; DWORD WINAPI thread_func_invoke_signal(LPVOID param) { MainWindow* parent = (MainWindow*)param; while (g_b_flag_thread_running) { count++; emit parent->signal_invoke_in_thread(count); ::Sleep(10); } }
//創建線程,並啟動 void MainWindow::on_pushButton_4_clicked() {
g_b_flag_thread_running = true; h_thread_func_invoke_signal = ::CreateThread(NULL, NULL, thread_func_invoke_signal, this, 0, NULL); if (NULL == h_thread_func_invoke_signal) { QMessageBox::information(this, tr("error"), tr("create thread fiald"), QMessageBox::Ok);
g_b_flag_thread_running = false; return ; }
}
//綁定了信號的槽 void MainWindow::on_signal_invoke_in_thread(unsigned int count) { QElapsedTimer t; t.start(); while (t.elapsed() < 10) { QCoreApplication::processEvents(); } qDebug() << count << endl; }
//停止線程 void MainWindow::on_pushButton_5_clicked() { g_b_flag_thread_running = false;
}
運行結果:
11
10
9
8
7
6
5
4
3
2
1
13
12
16
16
15
14
20
19
18
22
還有出現相同的,順序都亂亂的,
如果槽函數中的延時再大一些,應用程序就奔潰了,
如果去掉槽函數中延時,輸出結果就沒有問題,但是怎么可能沒有邏輯處理呢,所以需要謹慎使用,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
有好說法的前輩,希望不吝賜教,謝謝,
耶穌愛你