• 8758阅读
  • 6回复

QThread的事件循环问题 [复制链接]

上一主题 下一主题
离线wato
 
只看楼主 倒序阅读 楼主  发表于: 2009-10-28
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —

对多线程编程很陌生,弱弱地请教下大家:

如果在run()函数中没有手动启动QThread::exec(),那这个线程是不是就没有自己的事件循环?

如果没有事件循环的话,其他多个线程同时向此线程发信号,这些信号会不会丢失?
离线dbzhang800

只看该作者 1楼 发表于: 2009-10-28
这个我也不太清楚。不过

“信号和槽” 与 “事件” 不一样的,使用信号和槽 不需要 exec 来启动事件循环
离线wato
只看该作者 2楼 发表于: 2009-10-28
下午一直在看这方面的  今天才知道原来connect()可以有4种连接方式

其中有一种QueuedConnection适用于多线程间连接  QT会把signal转化成QEvent  使之进入相应线程的事件循环(如果有的话),然后那个线程从队列中取出这个事件,与相应的slot关联。
离线hiti_tony
只看该作者 3楼 发表于: 2009-10-28
也可以直接postevent
离线wato
只看该作者 4楼 发表于: 2009-10-28
下面是我总结的两种子线程的工作方式,发表了我自己理解的各自的优缺点,我也正因此苦恼,希望是我自己理解错了,不知有没有高人指点下

(子线程对象在gui线程实现)

1.让子线程进入事件循环,等待主线程的信号,但是这些子线程的槽函数都是在该子线程对象所在的线程(在这里也就是主线程)执行,这样似乎失去了多线程的意义。
void run()
{
    exec();
}

void slot1();  //处理工作
void slot2();  //处理工作
...

2.子线程没有事件循环,直接在run里处理工作,主线程可通过信号连接到该子线程的槽来控制flag,从而控制子线程的暂停和继续。
但是,如果还有另外几个线程不时地向通过slot2()给somarg赋值的话,即使给slot2()加了锁保证了不会被同时赋值,但那些同时
进入的赋值信号没有队列可进,这样会不会就丢失了呢
void run()
{
    while(1)
    {
    while(flag)
    {
        dosomething(somarg);
    }
    }
}

void slot1();  //控制flag
void slot2();  //给somarg赋值
...
离线wato
只看该作者 5楼 发表于: 2009-10-28
第2种方法比较好  现在有个办法是把传进来的信号先存进一个链表(比如QByteArray),然后一个个取出处理,这样不会丢失,但如果有更靠谱的办法则更好,毕竟这算是个土方。
离线wato
只看该作者 6楼 发表于: 2009-10-29
或者第一种方法在嵌套一个线程?

还是根本不是我理解的这样,知道的指点下
快速回复
限100 字节
 
上一个 下一个