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

亲们帮忙看一个多线程有关问题,多谢

2013-06-25 
亲们帮忙看一个多线程问题,谢谢!前提是这样的:我有100多万个数据要通过一个函数计算,开始我用一个线程去计

亲们帮忙看一个多线程问题,谢谢!
前提是这样的:我有100多万个数据要通过一个函数计算,开始我用一个线程去计算一次要一个多小时,于是我想通过多线程分组计算。但是却没有什么效果,速度并没有变快,而且同样会卡死主线程


TMREWSync *readl;
class GetTZ : public TThread
{
private:
protected:
void __fastcall Execute();
public:
SSQ *start;
SSQ *end;
int tzno;
__fastcall GetTZ(bool CreateSuspended,SSQ *stp,SSQ *edp,int ctn);
void __fastcall SSQTj();
};
__fastcall GetTZ::GetTZ(bool CreateSuspended,SSQ *stp,SSQ *edp,int ctn)
: TThread(CreateSuspended)
{
start=stp;
end=edp;
tzno=ctn;

}
void __fastcall GetTZ::Execute()
{
//---- Place thread code here ----
Synchronize(SSQTj);

}
void __fastcall GetTZ::SSQTj()
{
AnsiString selstr;bool SelRed[33];bool SelBlue[16];bool Sure[33];bool Del;int Range[2];

for(int lis=0;lis<tzno;lis++)
{
int countsure=0;
                //TMutiReadExclusiveWriteSynchronizer;
readl->BeginRead();
selstr=NetTZ->Strings[lis];
readl->EndRead();
         //------------计算数据
         }
}
//-------------------主线程调用
       while(end)
{
end=end->next;
count++;
if(end==NULL||count>=maxtz)
{
GetTZ *tjThread;
tjThread=new GetTZ(true,st,end,NetTZ->Count);
tjThread->Resume();
countthread++;
count=0;
st=end;
                }
        }



第一次写多线程的程序不知道是不是哪里不对导致这种情况,我用3万多个数据分4线程测试,第一次运行速度比单线程速度快,再运行一次比单线程速度还慢。调试的时候感觉就是所有线程都在做异步计算……
我调了程序自带的多线程排序排序,发现那个程序也会卡死主线程。
请教一下该怎么改啊?
多线程
[解决办法]
单处理器,线程本来微观上就是你说的异步执行的,所以多开几个线程做这样的计算速度会更慢的。
多处理器上操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上,你这样应该可以吧,
你说的卡死主线程是主线程等待其他线程吗?

[解决办法]
void __fastcall GetTZ::Execute()
{
    //---- Place thread code here ----
    Synchronize(SSQTj);
}

以上是你的代码,这样写其实是多个线程排队串行运行,并且等待的线程还要一直抢控制权。Synchronize是用来和VCL同步的,相当于是在主线程里执行的。建议把计算的部分放在Execute()函数里,最好加上Sleep函数。修改界面的部分放在单独的函数里,计算完后,用Synchronize来调用这个函数。

热点排行