//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的信号与槽机制
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)