首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多线程 列队处理 事件有关问题

2013-08-04 
多线程 列队处理 事件问题我的情况是这样的:我开辟一个线程 读取一个文件内容,然后保存到全局变量vector里

多线程 列队处理 事件问题
我的情况是这样的:
我开辟一个线程 读取一个文件内容,然后保存到全局变量vector里,
我开辟了多个线程,同时读取多个文件,
怎样使多个线程,按照先后顺序,等上一个线程结束,然后再开启下一个线程?


unsigned Counter; 
vector<int> Tvector;
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
    //每个线程往容器里添加1000000个数据
    
    .......
 
     // 怎样判断上一个程序有没有结束,结束后再执行下一个线程函数????????问题二

    ..........
    while ( Counter < 1000000 )
        Tvector.push_back(Counter);
 
    _endthreadex( 0 );
    return 0;

 
int main()

for(int k=0;k<10;k++)
{
   //同时 创建10个线程,但不知道怎样先将后面的线程挂起,不执行??????问题一
    HANDLE hThread;
    unsigned threadID;
 
    printf( "Creating second thread...\n" );
 
    hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );
 

   // WaitForSingleObject( hThread, INFINITE );
    
    CloseHandle( hThread );
}
}


[解决办法]
用户鼠标点击一次,我就打开读取一个文件,然后把数据添加到全局数组里。现在我的做法是每点击一次就开辟一个线程去执行。问题一:如果鼠标操作很频繁,但读取文件函数处理很慢,是不是不太好?问题二:我能不能判断鼠标点击时,前几次鼠标点击运行事件的状态,然后等待前面点击执行完,再执行事件?
-----------------------------------------------------
读取文件的速度是比不上鼠标点击速度的,你用开线程也不能解决问题。
恰当的做法是,鼠标点击一次,就把文件名记下,保存在一个数组或者链表中,等所有的都点完了再开始一个个从链表中读取文件名进行操作。不需要多线程。
复杂一点的做法是,另外只开1个线程读取文件。主线程维护一个队列,鼠标每点击一次,就把文件名存放到队列尾部。最后主线程还需要一个结束的标志,通知线程退出。
读取的线程等待1个信号量(主线程每次取得一个文件名,信号量+1),有信号的时候就从队列头取得文件名进行操作,没信号就一直等待。当然线程还需要判断是否又结束标志(可以用1个volatile 变量)
还需注意主线程和读取线程对这个队列要进行同步处理(加锁解锁)

热点排行