
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++,你不熟悉编程环境,是很难理解的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)