请问Qt中使用WinThread通常如何实现线程间通信如传递QByteArray

请问Qt中使用WinThread通常如何实现线程间通信如传递QByteArray,第1张

在Qt里面是QThread吧,如果是多线程要在一个类里面也没啥问题,效率那主要就是考虑你线程干什么工作了,在Qt里面,你可以直接继承QThread类并实现它的run方法就可以了

class Worker_1 : public QThread

{

public:

Worker_1()

~Worker_1()

protected:

virtual void run() { // do somthing }

}

class Work_2 //你同样可以写出Work_2这个类

class WorkManager : QObject

{

Q_OBJECT

//......

public:

void start()

{

w1.start()

w2.start()

}

private:

Worker_1 w1

Worker_2 w2

}

// test main function

int main(void)

{

WorkManager wm

wm.start()

while(1) QThread::sleep(300000)

}

在Qt里面QMutex、QSemphore只可以用来做线程间同步,如果你涉及到多线程共享资源的访问的话

两个线程间传递QByteArray,如果这个QbyteArray非常大的话,你建议你使用共享内存的方式,当然如果情况还好,可以使用Qt的信号与槽机制

public int _CurrentThread

//form1_load中的,启动线程的代码在这里。

private void Form1_Load(object sender, EventArgs e)

{

//设置最大线程数

int MaxThread = 5

//获取需要完成的任务列表

OleDbConnection AccessConn = AccessModule.Conn("D:\\Flying Co\\flying.mdb")

string sql = "select * from ty_task where bay_flag=" + false + " order by bay_id asc"

OleDbCommand comm = new OleDbCommand(sql, AccessConn)

OleDbDataReader list = comm.ExecuteReader()

while (list.Read())

{

ContentParse Spider = new ContentParse()

//如果当前活动线程超过最大线程数,线程休眠

if (Spider.CurrentThread>MaxThread)

{

Thread.Sleep(2000)

}

else

{

//init

Spider.Url = list["bay_task"].ToString()

//启动一个线程

Thread SpiderThread = new Thread(new ThreadStart(Spider.execute))

SpiderThread.Start()

MessageBox.Show(Spider.CurrentThread.ToString())

//任务设置为已处理

sql = "update ty_task set bay_flag=" + true + " where bay_id=" + list["bay_id"].ToString()

AccessModule.Execute(AccessConn, sql)

}

}

list.Close()

AccessModule.DisConn(AccessConn)

}

//线程启动的是这个类的方法

class ContentParse

{

private string _Url

//设置任务参数

public string Url

{

set

{

_task = value

}

}

public void execute()

{

//活动线程数加1

Interlocked.Increment(ref _CurrentThread)

//中间处理任务的代码省略

//该线程完成,活动线程减1

Interlocked.Decrement(ref _CurrentThread)

}

我现在纠结的就是这个Interlocked.Increment(ref _CurrentThread)应该是开一个线程就要加1的对吧?

但是我在form1中间用 MessageBox.Show(Spider.CurrentThread.ToString()),总是0噢

QT线程是独立的类:

在QT中添加C++类,头文件引用#include <QThread>类公开,这样写:

class XXXX:public QThread,类里面申明Q_OBJECT,直接写在里面。signals: XXX()这是你的订阅事件名。private:void run()这是run函数;public: int cona=3这是变量,一定要public。

cpp文件里引用头文件,run函数里面写方法:

void XXXX::run()

{

do

{

msleep(cona)

emit connec()

}while(true)

}

上面就是线程类了。现在我们在窗体中应用,先在头文件申明

头文件private: XXXX *thread1XXXX *thread2

构造函数中初始化他们

thread1=new XXXX()

thread1->cona=3

QObject::connect(thread1,SIGNAL(connec()),this,SLOT(XXX信号1()))

thread2=new XXXX()

thread2->cona=4

QObject::connect(thread2,SIGNAL(connec()),this,SLOT(XXX信号2()))

XXX信号1()是读A数据,XXX信号2()读B数据。

按钮1的信号槽里写方法同时进行每3秒读A、没4秒读B

thread1->start()

thread2->start()

要结束谁就用 xxxx->terminate()

看明白没?QT可不同与C++,你不熟悉编程环境,是很难理解的。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9897380.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存