pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

如何避免 Qt app.exec() 阻塞主線程

How to avoid Qt app.exec() blocking main thread(如何避免 Qt app.exec() 阻塞主線程)
本文介紹了如何避免 Qt app.exec() 阻塞主線程的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我是 Qt 新手,但需要解決一個難題.

I'm new to Qt, but need to solve a difficult problem.

我創建了一個非常簡單的 GUI,我需要將它添加到現有的 C++ 應用程序中.問題是,我只編寫了一個模塊,該模塊插入到一個更大的架構中,這限制了我對主線程的訪問.

I've created a VERY simple GUI that I need to add to an existing C++ application. The problem is, I'm writing just one module that plugs into a larger architecture which restricts my access to the main thread.

我的代碼必須位于以下四個函數中:一個 Init() 函數,它在主線程中運行.以及在工作線程中運行的 WorkerStart()、WorkerStep() 和 WorkerStop() 函數.

My code must reside inside the four following functions: an Init() function, which runs in the main thread. and WorkerStart(), WorkerStep(), and WorkerStop() functions that run in a worker thread.

我在 Init() 函數中編寫了 QApplication 和 GUI 對象.但當然,在該函數的末尾調用 app.exec() 會阻止整個其余代碼.不可行.

I coded my QApplication and GUI objects in the Init() function. But of course, calling app.exec() at the end of that function blocks the entire rest of the code. Not workable.

我所讀到的一切都表明 Qt gui 對象只能在主線程中運行.

Everything I'm reading says that Qt gui objects can only run in the main thread.

所以我的問題是,如何在 init() 函數(主線程)中設置我的 gui 并允許它從那時起僅使用工作線程運行?

So my question is, how can I set up my gui in the init() function (main thread) and allow it to run by only using the worker thread from then on?

我發現了這個:非主線程中的 QApplication

這些解決方案給了我一些不同的行為.方向正確,但不穩定或功能不全.但是我不明白如果qt gui只能在主線程中運行,為什么這些都是解決方案,而這些解決方案將它們放在其他線程中.所以這就是發送關于什么可以和不能在其他線程中運行的混合消息,這變得非常混亂.

and those solutions gave me some different behavior. In the right direction, but not stable or fully functional. But I dont understand why those are solutions at all if qt gui's can only run in main thread, and these solutions put them in other threads. So thats sending mixed messages on what can and can not run in other threads, and it becomes very confusing.

向現有 C++ 程序添加 gui 而不將其鎖定在 exec() 函數中似乎是一種相當普遍的情況,所以我覺得我遺漏了一些明顯的東西.有人可以幫助我解決這個問題嗎?

It seems that adding a gui to an existing C++ program without locking it up in the exec() func should be a fairly common situation so I feel like I'm missing something obvious. Can someone help with how I can solve this?

非常感謝.菲爾

推薦答案

大多數時候,主線程"==GUI 線程",所以人們交替使用這些術語——即使是官方文檔也是如此.我同意這很令人困惑,因為它們不必相同.^ 實際規則是這樣的:

Most of the time, "main thread" == "GUI thread", so people use those terms interchangeably -- even the official documentation does that. I agree that it's confusing though, because they don't have to be the same.^ The actual rule is this:

GUI 類只能從實例化 QApplication/QGuiApplication

GUI classes must only be accessed from the thread which instantiates QApplication/QGuiApplication

使用像您這樣的插件,您需要執行以下操作:

With a plugin like yours, here is what you need to do:

  1. 創建一個新的std::thread(不是QThread)
  2. 在該線程中運行 init 函數.讓它實例化你的 QApplication/QGuiApplication 并啟動事件循環
  3. 確保所有 GUI 對象只能從該線程訪問.
  1. Create a new std::thread (NOT a QThread)
  2. Run an init function in that thread. Let it instantiate your QApplication/QGuiApplication and start the event loop
  3. Ensure that all your GUI objects are accessed from that thread only.

瞧,您現在擁有一個不是主線程的 GUI 線程.

Voila, you now have a GUI thread that is not your main thread.

^注意:在 Mac OS X 上情況不同.由于 Cocoa 框架的限制,主線程必須是 GUI 線程.我上面概述的步驟適用于 Windows/Linux,但不適用于 Mac.對于 Mac,您需要將代碼注入主線程——請參閱下面的 Kuba Ober 的評論.

^Note: It is a different story on Mac OS X. Due to restrictions in the Cocoa framework, the main thread MUST be the GUI thread. The steps I outlined above will work on Windows/Linux but not on Mac. For Mac, you need to inject your code into the main thread -- see Kuba Ober's comments below.

這篇關于如何避免 Qt app.exec() 阻塞主線程的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數據?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環: for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環?)
Reusing thread in loop c++(在循環 C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環形?)
主站蜘蛛池模板: 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 北京公寓出租网-北京酒店式公寓出租平台 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | 税筹星_灵活用工平台_企业财务顾问_财税法薪综合服务平台 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | HDPE储罐_厂家-山东九州阿丽贝防腐设备| 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 上海物流公司,上海货运公司,上海物流专线-优骐物流公司 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 杰恒蠕动泵-蠕动泵专业厂家-19年专注蠕动泵 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 |