qt子线程如何传输数据给主线程

qt子线程如何传输数据给主线程,第1张

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自带的数据库完成 *** 作,以下是参考代码:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE")   //添加数据库

db.setDatabaseName("note.db")    //创建一个note.db的文件存储数据

db.open()  //开启数据库

query = QSqlQuery(db) //获得访问数据库的query

query.exec(XXX)  //执行指令(XXX为SQL指令)

db.close()  //关闭数据库

一般而言会将db变量作为全局变量或者数据成员,当需要访问的时候就获取一个query就可以了。

要实现所提到的功能,要好好看看QString、QStringList,这两玩意主要是临时存放数据、分割数据等作用,另外,要看QFile、QDir、QFileInfo、QTextStream,这四个主要用来读取文本数据。看看QVector或者QList等来存放读出来的数据。

另外,要实现这玩意,SQL的语句不要求精通,但是基本的Create、Insert、Select、Delete等 *** 作要准确无误。否则出错了QT是看不出来的。QT不会检测SQL的准确性的。

在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的信号与槽机制


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

原文地址: http://outofmemory.cn/sjk/6699835.html

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

发表评论

登录后才能评论

评论列表(0条)

保存