![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 53
证券指标
这个作者很懒,什么都没留下…
展开
-
Event 事件对象
Event对象之所以有大用途,正是因为它们的状态完全在你掌控之下。Mutexes和sem aphores就 不 一 样 了 , 它 们 的 状 态 会 因 为 诸 如WaitForSingleObject()之类的函数调用而变化。所以,你可以精确告诉一个event对象做什么事,以及什么时候去做。Event对象是一种核心对象,它的唯一目的就是成为激发状原创 2015-10-16 11:44:51 · 310 阅读 · 0 评论 -
多线程 同步 临界区
多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作。除非你让它们同心协力,否则必然会出现“raceconditions”(竞争条件)和“data corruption”(数据被破坏)的情况。在典型的办公室文化中,协调工作是由管理者来执行的。类似的解决方案,也就是“让某个线程成为大家的老板”。临界区临界区是一段代码(不好理解,原创 2015-10-16 10:06:55 · 274 阅读 · 0 评论 -
不要长时间锁定某一个资源
我能够给你的最牢靠而最立即的警告就是,千万不要在一个criticalsection之中调用 Sleep() 或任何 Wait...() API 函数。当你以一个同步机制保护一份资源时,有一点必须常记在心,那就是:这项资源被使用的频率如何?线程必须多快释放这份资源,才能确保整个程序的运作很平顺?某些人会关心这样的问题:如果我再也不释放资源(或不离开原创 2015-10-16 10:17:21 · 353 阅读 · 0 评论 -
QThread finished()信号 wait()方法
当QThread线程的run()函数return之后,该线程就会发出finished()信号。但是,有时候,在finished()信号的槽中,发现该线程依然正在运行,即没有真正的finished,通过调研running()方法,或者isFinished()方法即可验证。此时,如果想继续使用该QThread,即重新进入该线程的run()函数,必须要等到该线程完成fin原创 2015-11-25 09:31:06 · 24398 阅读 · 3 评论 -
主线程 子线程 加锁原因
1原创 2015-11-24 18:15:41 · 1662 阅读 · 0 评论 -
QOjbect 类 moveToThread()函数的作用
昨晚在一个邮件列表里面看见一个关于在线程种使用signal/slot的讨论,由于回复太多,这里就不贴出原文了。 主要是关于怎样从一个线程发送信号到另外一个线程的问题。其实这个也不是什么复杂的问题,在qt的asstant里面已经描诉的比较清楚了。当我们链接信号的时候使用qt::queuedConnection就能使slot在它自己的线程里面运行。 另我惊讶的是在其转载 2016-03-23 13:54:06 · 2055 阅读 · 0 评论 -
sleep函数的精度 不精确
Qt 线程暂停使用sleep 是本文要介绍的内容,关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。sleep函数的精度非常低,当系统越繁忙的时候它精度也就越低,有时候我转载 2016-05-12 10:50:56 · 8241 阅读 · 0 评论 -
线程 wait()方法----------------------------很重要
QThread::wait(),一直以来我以为它阻塞的是QThread对象,可是我现在明白,原来阻塞的是这个对象所在的线程(通常是主线程)。原创 2015-10-27 15:01:43 · 1227 阅读 · 0 评论 -
QSharedMemory
QSharedMemory首先是setKey(),这是标记共享内存的一个标识符,在整个操作系统的共享内存中,用这个key去标识它,唯一标识。attach()函数,在workstation.exe进程中,调用 该共享内存的attach()函数,注意是,将该exe绑定到该共享内存中,如果要使用某个共享内存,必须要想将exe绑定到共享内存中,只有绑定成功,才能使用,原创 2016-06-03 15:18:48 · 4500 阅读 · 0 评论 -
QSharedMemory 共享内存 进程间通信
QT间进程通信之共享内存 Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。比如说QQ的聊天的客户端,这里有个个性头象,当点击QQ音乐播放器的时候,启动QQ音乐播放(启动一QQ音乐播放器的进程)这时QQ音乐播放器里也有一个个性头像,这两者间的头像一样,现用共享内存的方法实现。先说下实现共享内存的步骤,然后用一具体的实例说明。向共享内转载 2016-06-03 15:11:45 · 3094 阅读 · 4 评论 -
线程安全 与 跨线程使用 没有任何关系
QObject类,及其子类不是线程安全的,但是,丝毫不妨碍,QObject跨线程使用,所以说,虽然QTcpSocket类不是线程安全的, 但是,按道理来说,该类,可以在子线程和主线程中同时使用,才对原创 2016-08-24 14:40:11 · 529 阅读 · 0 评论 -
QTcpSocket 跨线程 QThread拥有权问题
本文介绍的是Qt中采用多线程Socket编程,由于工作的需要,开始接触Qt的socket编程。Qt里的example是个不错的教程,但是当我把代码移植到多线程的环境时就出问题了:QObject: Cannot create children for a parent that is in a different thread. 由于想要在线程中保留一个socket,以便维持双边通信,因此定转载 2016-08-24 13:53:19 · 8560 阅读 · 0 评论 -
GUI类 只能在主线程中被使用,不能跨线程使用
此外,QWidget及其子类,以及所有其它 GUI 相关类(即便不是QObject的子类,例如QPixmap),甚至不是可重入的:它们只能在 GUI 线程访问。原创 2016-08-24 14:06:09 · 1983 阅读 · 0 评论 -
跨线程 信号的连接类型
Qt 需要查看信号发出的线程是不是与接受者所在线程一致,来决定连接类型。注意,Qt 检查的是信号发出的线程(即,信号在哪个Thread中emit的,)classThread :public QThread{Q_OBJECTsignals: voidaSignal();protected: voidrun(){原创 2016-08-24 14:20:46 · 633 阅读 · 0 评论 -
线程安全 问题 如何判断一个类是否是线程安全的
值得注意的一点是,QObject及其所有子类都不是线程安全的(但都是可重入的)。因此,你不能有两个线程同时访问一个QObject对象,除非这个对象的内部数据都已经很好地序列化(例如为每个数据访问加锁)。原创 2016-08-24 14:05:10 · 7847 阅读 · 0 评论 -
子线程 run() 函数中,调用其他函数
class TestObj: public QObject{ Q_OBJECTpublic: void EmitSig() { emit sigTest();//都是在子线程中, } signals: void sigTest();};TestThread::TestThread原创 2016-08-24 17:26:22 · 2034 阅读 · 0 评论 -
同步 异步 概念
让我先对同步(synchronous)与异步(asynchronous)做个说明。当程序1调用程序2时,程序1 停下不动,直到程序2完成回到程序1来,程序1才继续下去,这就是所谓的“synchronous”。如果程序1调用程序2后,径自继续自己的下一个动作,那么两者之间就是所谓的“asynchronous”。原创 2015-10-16 09:48:06 · 344 阅读 · 0 评论 -
死锁
ormal; font-weight: normal; letter-spavoid SwapLists(List *list, List *list2){List *tmp_list;EnterCriticalSection(list1->critical_sec);EnterCriticalSection(list2->critical_sec);tmp->list = l原创 2015-10-16 10:29:52 · 470 阅读 · 0 评论 -
主线程 子线程 通信 最好用同步方式
从Worker 线程中显示输出此刻我想先打个岔,请各位看看,如何让wo rker 线程把字符串放到列表框(listbox)中。列表框的消息循环总是被程序的主线程掌管,虽然这并非绝对必要,但是让主线程负责所有的屏幕更新工作,是相当理想的。我在程序中定义了一个消息,名为WM_PLEA SE_UPDATE。当wo rker线原创 2015-10-16 11:26:55 · 664 阅读 · 0 评论 -
qt类 可重入
如果类的不同实例,可以同时用于不同的线程中,那么这个类就是可重入的。比如一个类ClassA,它的两个实例,A_1 和 A_2。A_1在主线程中使用,A_2在子线程中使用。这两个实例可以在两个线程中同时被使用。那么就说类ClassA是可重入的。QT中的大部分 非界面类 都是可重入的。 也就是说,这些类的不同实例,可以在不同的线程中被使用。然而,多个线原创 2015-10-16 16:31:07 · 662 阅读 · 0 评论 -
主线程 如何控制 子线程
当我开始在Win32 上使用线程时,这个问题就一直在折磨我。我花了数天甚至数周的时间来寻找答案,并且希望找到的是一个好答案。这个问题是:我如何在某个线程内终止另一个正在运行的线程?TerminateThread()强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。这带来的副作用便是,线程没有机会在结束前清理自己原创 2015-10-16 14:17:50 · 1188 阅读 · 0 评论 -
vs调试 多线程
Visual C++调试器可以支持“多线”情况。例如,当一个线程遭遇一个断点时,调试器会自动切换到该线程的context 去。这所产生的一些行为,可能会令第一次见到的你感到惊讶。如果你在一个“许多线程都会调用的函数”内设立断点,每当一个线程遭遇此断点,调试器便会在线程之间循环切换。我遇过这种情况数次。我设立一个断点,并且尝试执行下一步,结果却再次回到断点。我想调原创 2015-10-16 14:54:55 · 2690 阅读 · 0 评论 -
volatile 关键字
我相信你一定遇到过这样的问题:你把某人的名字和电话号码写到你的通讯录中,数个月之后企图打电话给这个人,却发现资料已经过期了。同样的情况也可能发生在编译器为你产生的程序代码中。编译器最优化的结果是,设法把常用到的数据放在 CPU 的内部寄存器中。这些寄存器就像你的通讯录一样。数据从寄存器中读出,远比从内存中读出快得多。当然啦,如果另一个线程改变了内存中的变量值,那么此变量在寄原创 2015-10-16 14:52:26 · 335 阅读 · 0 评论 -
加锁的原因 结构体内部增加锁
比如,链表的inset函数,需要加锁。那么,就应该在ListNode类的内部增加成员变量,用于锁定。要给链表的insert()方法,加锁的原因:比如某个List实例,list_1,该变量在主线程和子线程中,被共享了。即主线程也调用list_1的Insert()方法,子线程也调用。这样就必须要加锁才行。请注意,我把CRITICAL_SECTION 变量放在原创 2015-10-16 10:11:34 · 1900 阅读 · 1 评论 -
sleep waitFor区别
感觉还是wait*系列函数更好一些因为可以在完成相同功能的情况占用更少的CPU资源,实时性要好一些比如串口通讯的握手过程使用Wait*系列函数,可以发送完毕后设置超值为30秒,当是当有数据到达时以立即停止等待,处理数据如果使用Sleep只能有两种方法,循环执行多个短时间的Sleep或者Sleep(30000)如果前一种情况因为在循环,所以会占用CPU资源如果有后一种方法转载 2015-10-14 14:53:05 · 572 阅读 · 0 评论 -
QtConcurrent 名字空间 run函数
要使用QtConcurrent 名字空间 run函数。必须包含#include 头文件,否则报错:run不是QtConcurrent的成员函数。原创 2015-10-12 10:58:57 · 2254 阅读 · 0 评论 -
线程等待 推荐WaitForSingleObject() 不推荐busyLoop
busy Loop是这样的:for()比如百万次的空循环。for中什么也不做。但是cpu没有闲着,线程依然在占用着cpu,只是cpu干的事情没有意义,在走for循环。如果想让线程等待几秒后,继续运行,不推荐busy loop。而推荐WaitForSingleObject()方法。WaitForSingleObject()方法,可以等待多个windows核心对原创 2015-10-16 09:34:46 · 1486 阅读 · 0 评论 -
QFutureWatcher 可以使用信号
QFuture表示异步计算的结果。用QtConcurrent::run 开始一个线程,用QFutureWatcher来监视整个线程。这里写了一耳光future类:.hclass Future : public QObject { Q_OBJECT public: Future(QObject *parent = NULL); ~Future();转载 2015-10-27 10:56:55 · 1626 阅读 · 0 评论 -
QFuture QFutureWatcher
QFuture, QFutureWatcher第一次看到这两个类,感觉很有意思,也很有用。整理如下:先来说说QFuture:QFuture类代表了一个异步调用的结果。而这个异步调用需要使用Qt Concurrent架构中的API。QFuture让线程可以通过某个后期产生的结果来实现同步。这个结果可以是任何拥有默认构造函数和拷贝构造函数的类型。如果这个结果在调转载 2015-10-27 10:53:31 · 2115 阅读 · 0 评论 -
QThread 的使用方法 注意事项
起源昨天不小心看到Qt开发人员( Bradley T. Hughes)Blog中的一片文章 you are-doing-it-wrong 。 结果看得头昏脑胀:好歹也自学了近1年的Qt,也一直很小心、很认真地阅读Qt和manual和例子等资料,却被突然告知,QThread的正确使用方法是一种自己从没见过,而且Qt manual、example、书籍中都没有提到过的一种方法。到底怎么了.转载 2015-10-27 15:05:09 · 1495 阅读 · 0 评论 -
调试程序 识别线程 用QThread::currentThread()方法
调试程序 识别线程 用QThread::currentThread()方法同一个线程,该方法返回的值一样。而不要使用currentThreadId()这个方法。不知道为何,同一个线程,该currentThreadId()返回的值不一样。qDebug()原创 2015-10-27 17:50:37 · 4110 阅读 · 0 评论 -
内核对象的两种状态 激活 未激活
WaitForSingleObject( handle_1 )函数的返回依据:如果handle_1内核对象正处于激活状态,那么WaitForSingleObject()函数立刻返回,同时handle_1内核对象的状态变为未激活。并且,调用WaitForSingleObject()函数的线程,拥有了handle_1对象的使用权。也就是锁定了该内核对象。激活状态:表明,该内核对象现原创 2015-10-16 10:53:31 · 569 阅读 · 0 评论 -
Mutex 互斥量
Mutex是内核对象,能够被WaitForSingleObject()函数请求。而CriticalSection不是内核对象。不能被WaitForSingleObject()函数请求。Win32的 Mutex 用途和 critical section 非常类似,但是它牺牲速度以增加弹性。或许你已经猜到了,mutex 是 MU Tual EXc原创 2015-10-16 11:00:48 · 381 阅读 · 0 评论 -
qt中的线程 拥有权 一个对象属于哪个线程
C++class MyThread : public QThread{public: MyThread() { otherObj = new QObject; } private: QObject obj; QObject *otherObj; QScopedPointer yetAnotherObj;};原创 2016-08-24 14:03:45 · 4024 阅读 · 0 评论