我會盡量明確。我創建了一個Qt應用程序,它有一些按鈕和一個QTextEdit。接下來我創建一個pthread。並提供指向MainWindow的指針作爲參數。類似這樣的:從pthread發送信號到QObject
MainWindow w;
pthread_create(&rThread,NULL,treat,&w);
treat是創建線程時執行的函數。現在,如果我有一個名爲myButton的按鈕,和我做財產以後這樣的對待函數內部:
void *treat(void *arg)
{
MainWindow *win = (MainWindow*)arg;
win->ui->myButton->setEnabled(false);
close(pthread_self());
}
它會正常工作,併爲myButton在我的應用程序將禁用。但是,如果我做這樣的事情:
void *treat(void *arg)
{
MainWindow *win = (MainWindow*arg;
win->ui->editText->setText("random string");
close(pthread_self());
}
我的應用程序將出現以下錯誤崩潰:
QObject: Cannot create children for a parent that is in a different thread. (Parent is QTextDocument(0x23af2e0), parent's thread is QThread(0x209a290), current thread is QThread(0x7f7eec000af0) The program has unexpectedly finished.
據我瞭解用戶界面是住在主線程,可能不是在入店我創建的線程,儘管我提供了主窗口的指針給這個線程。但爲什麼禁用按鈕的工作?我很困擾。我之所以使用QThread是因爲我們的老師告訴我不這樣做。我必須使用pthreads。我怎麼能從pthread應用到editText這樣的變化? 我怎麼能發送一個信號從一個pthread到另一個線程在這個Ui是「生活」。先謝謝你們。
謝謝你。那就是訣竅。我無法在兩天內找到解決此問題的解決方案。我恨我的老師讓我們使用pthreads而不是QThreads。最後它的工作原理。先生,我向你致以最良好的問候! :) – Zan
@Zan:'QThread'讓生活變得簡單一些,但是你會遇到和pthread一樣的限制。也就是說,你不能對非線程安全的方法直接進行跨線程調用(除非另有說明,否則請閱讀:*所有*方法)。 –