利用qt的qthread新建執行緒處理資料,處理完成后,再利用建構式中的QT信號與槽回傳conne(queuedconnection)ct主執行緒。但是信號發出后,槽函式不執行!
uj5u.com熱心網友回復:
你引數是不是自己定義的?如果是自己定義的,需要注冊一下
uj5u.com熱心網友回復:
不是自己定義的,不用傳引數
uj5u.com熱心網友回復:
代碼給出來吧
uj5u.com熱心網友回復:
ThreadFunc::ThreadFunc(QObject* parent):QThread(parent)
{
connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::QueuedConnection);
}
ThreadFunc::~ThreadFunc()
{
Release();
}
void ThreadFunc::run()
{
//..............
emit Signal();//信號
}
void ThreadFunc::AfterFunc()//槽函式
{//進不來??
//......................
}
你引數是不是自己定義的?
如果是自己定義的,需要注冊一下
不是自己定義的,不用傳引數
代碼給出來吧
uj5u.com熱心網友回復:
run進去了沒,完整代碼有嗎?.h
.cpp
都貼出來吧
你可以參考下QThread檔案(QT自帶的檔案)
uj5u.com熱心網友回復:
對你的信號接收者呼叫下面的函式,并啟動執行緒 thread->start()
receiver->moveToThread(thread);
uj5u.com熱心網友回復:
class WorkerThread : public QThread
{
Q_OBJECT
void run() override {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &s);
};
void MyObject::startWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
}
uj5u.com熱心網友回復:
學會使用QT Creator里的幫助檔案uj5u.com熱心網友回復:
在Run中呼叫 connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::QueuedConnection);uj5u.com熱心網友回復:
另外run中需要阻塞,不阻塞會直接退出執行緒,還怎么呼叫?uj5u.com熱心網友回復:
在Run中呼叫 connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::QueuedConnection);
不需要在run中connect的,也不一定要阻塞的。
還是參考官方例子好。
uj5u.com熱心網友回復:
建議樓主學習下win32編程推薦書籍
windows核心編程 老外寫的
windows程式設計 王艷 張錚
uj5u.com熱心網友回復:
建議樓主學習下win32編程
推薦書籍
windows核心編程 老外寫的
windows程式設計 王艷 張錚
非常感謝您的例子,我會努力繼續學習這方面的知識。另外我想知道我的代碼錯在哪里?也不是一直回不到主執行緒,有時候可以有時候不行。我想的是輔助線程執行完畢耗時操作,發信號到主執行緒(槽函式)
uj5u.com熱心網友回復:
另外run中需要阻塞,不阻塞會直接退出執行緒,還怎么呼叫?
為什么不阻塞會退出?
uj5u.com熱心網友回復:
對你的信號接收者呼叫下面的函式,
并啟動執行緒 thread->start()
receiver->moveToThread(thread);
有thread->start();
呼叫receiver->moveToThread(thread);?
uj5u.com熱心網友回復:
直接看官方例子,參考寫就可以了。要么把你完整代碼貼出來,你貼一半,讓別人怎么幫你?
uj5u.com熱心網友回復:
2樓帖子能搞定的事,你非要拖。。原始碼有什么值錢的業務嗎。。。。。。
uj5u.com熱心網友回復:
另外run中需要阻塞,不阻塞會直接退出執行緒,還怎么呼叫?
為什么不阻塞會退出?
大概明白你的做法,子執行緒處理完成,信號發送給主執行緒然后退出子執行緒,你在使用子執行緒的時候應該是new一個,執行緒結束后delete是嗎?你嘗試一下在子執行緒發送信號后qsleep(100), 休眠100ms看看能不能解決有時候可以有時候不行的問題。
uj5u.com熱心網友回復:
new完執行緒物件以后,呼叫start方法了嗎?uj5u.com熱心網友回復:
建議使用connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::DriectConnection);或者connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::BlockingQueuedConnection);
QueuedConnection不會阻塞當前執行緒,有可能槽函式還來不及執行你的Thread就已經結束了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/120853.html
標籤:Qt
