qt QThread、QMutex、QSemaphore
QThread:
创建线程(2种方式):
1:
1.1 新建一个继承 QTherad 的类myTherad(不能有ui),重写 run() 函数(真正新线程处理的地方,因为不方便随时调用所以一般是个while循环) 。
1.2 主线程 new 上面的那个类 myTherad* _myTherad = new myTherad(this)
1.3 开始运行 run() : _myTherad.start();
2(默认支持事件循环(Qt的许多非GUI类也需要事件循环支持,如QTimer、QTcpSocket),QThread要支持事件循环需要在QThread::run()中调用QThread::exec()来提供对消息循环的支持,否则那些需要事件循环支持的类都不能正常发送信号,因此如果要使用信号和槽,那就直接使用QObject来实现多线程):
2.1 先随意新建一个类 classTs继承QObject就好,类里面有些方法
2.2 classTs* ts = new classTs; // 这里不能用this,因为你整个是要给子线程的
2.3 QThread* _myTherad = new QThread(this); // 创建子线程
2.4 ts->moveToThread(_myTherad ); // 把你随意建的类移动到子线程里面去,现在那个类就是属于子线程的人了
2.5 _myTherad->start(); // 开启线程
现在开始classTs类里的函数就都是在子线程里面运行了,至于怎么触发classTs类的函数,一般用型号槽,比如我点击主页面的一个按钮执行classTs类里的 a 函数,a函数就是在子线程里执行的了
结束线程:
在run函数调用exit()或者quit()函数可以结束线程,或在主线程调用terminate或stopImmediately()强制结束线程。
全局线程和局部线程的区别
1.全局线程需要调wait阻塞等待,防止主线程窗口销毁了,把线程对象也释放了,而线程还没出来,会引起崩溃。
2.局部线程退出时,需要通知主线程把线程指针置NULL
QMutex:
QSemaphore: 一个通用的可计数的信号量,信号量实际上就是广义的互斥量。一个互斥量只能被锁定一次,然而一个信号量可以被获取多次。信号量常被用于保护一定数目的同类资源。
基本操作:
QSemaphore::QSemaphore ( int n = 0 ) : 新建一个信号量,守护的资源数为n(默认为0)
QSemaphore::~QSemaphore ():销毁信号量警告:销毁一个正在使用的信号量将导致一个不确定的行为
int QSemaphore::available() const :用于返回可用资源的数目
void QSemaphore::acquire ( int n = 1 ):从该信号量守护的资源中获取n个资源。如果获取的资源数目大于available()返回值,那么自己将阻塞,直到可获取足够的资源数
void QSemaphore::release ( int n = 1 ):释放n个信号量守护的资源给信号量。该函数也可以用来增加一个信号量可使用的资源数目
bool QSemaphore::tryAcquire ( int n = 1 ):尝试从信号量守护的资源中获取n个资源。成功,则返回true。如果当前可用的资源数目不够立即返回,返回值为false,并且不占用任何资源
bool QSemaphore::tryAcquire ( int n, int timeout ):尝试从信号量守护的资源中获取n个资源。成功,则返回true。如果当前可用的资源数目available()不够,将等待timeout微秒。
例子:
__EOF__

本文链接:https://www.cnblogs.com/fxw1/p/17266153.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:封兴旺,转载请注明原文链接:https://www.cnblogs.com/fxw1/p/17266153.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异