我有一个应用程序,它基本上有一个GUI和一个负责运行我的主程序和创建对象的函数。
目前我的GUI会崩溃,因为当后台工作完成后会有太多的后台工作,它会再次恢复生机。
我需要创建一个工作线程(我们不需要接口线程,因为我的GUI只显示正在发生的事情的进展。),工作线程将运行我的函数,另一个工作线程将运行我的GUI。
我很难找到关于此的任何信息。谷歌似乎没有帮助,任何人都可以指出一些有用的信息吗?目前我有这样的事情:
void __fastcall TfrmRunning::FormCreate(TObject *Sender)
{
//Does most of my background stuff when this form is created
}
答案 0 :(得分:2)
Threadz与C ++ Builder很相似,特别是。如果您不需要任何GUI通信。关于GUI通信的问题,我不得不问一些建议 - 需要一个宏来处理消息,我提供了错误的表单类 - 我有一个堆栈溢出:)
“类”中有一个TThread类,类似于Delphi。覆盖'执行'以获取线程代码的执行,例如:
class TpoolThread : public TThread{
CBthreadPool *FmyPool;
protected:
virtual void __fastcall Execute(void);
public:
TpoolThread(CBthreadPool *myPool):TThread(true){
FmyPool=myPool;
Resume();
};
};
如果你没有TThread类,(我有C ++ Builder 2009 - 之前不确定),你可以按照@inkooboo的建议回退API调用。 WINAPI CreateThread()只调用简单的C风格函数或静态方法,因此您通常需要显式传递一个实例(通常是'this')作为CreateThread参数,以便从线程代码中调用实例方法。 ThreadPool示例使用CreateThread API,(虽然我确信如果你有STL,你也会有TThread):
#ifndef cthreadpoolH
#define cthreadpoolH
#include <Classes.hpp>
#include <deque.h>
class ThreadPool;
class PoolTask {
friend class ThreadPool;
TNotifyEvent FonComplete;
protected:
ThreadPool *myPool;
int param;
public:
PoolTask(int inParam, TNotifyEvent OnDone):param(inParam),FonComplete(OnDone){};
virtual void run()=0;
};
template <typename T> class PCSqueue{
CRITICAL_SECTION access;
deque<T> *objectQueue;
HANDLE queueSema;
public:
PCSqueue(){
objectQueue=new deque<T>;
InitializeCriticalSection(&access);
queueSema=CreateSemaphore(NULL,0,MAXINT,NULL);
};
void push(T ref){
EnterCriticalSection(&access);
objectQueue->push_front(ref);
LeaveCriticalSection(&access);
ReleaseSemaphore(queueSema,1,NULL);
};
bool pop(T *ref,DWORD timeout){
if (WAIT_OBJECT_0==WaitForSingleObject(queueSema,timeout)) {
EnterCriticalSection(&access);
*ref=objectQueue->back();
objectQueue->pop_back();
LeaveCriticalSection(&access);
return(true);
}
else
return(false);
};
};
class ThreadPool {
int FthreadCount;
PCSqueue<PoolTask*> queue;
public:
ThreadPool(int initThreads){
for(FthreadCount=0;FthreadCount!=initThreads;FthreadCount++){
CreateThread(NULL,0,staticThreadRun,this,0,0);
};
}
void setThreadCount(int newCount){
while(FthreadCount<newCount){
CreateThread(NULL,0,staticThreadRun,this,0,0);
FthreadCount++;
};
while(FthreadCount>newCount){
queue.push((PoolTask*)NULL);
FthreadCount--;
};
}
static DWORD _stdcall staticThreadRun(void *param){
ThreadPool *myPool=(ThreadPool*)param;
PoolTask *thisTask;
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_BELOW_NORMAL);
while (myPool->queue.pop(&thisTask,INFINITE)){
if(thisTask==NULL){return(0);};
thisTask->run();
if (thisTask->FonComplete!=NULL) {
thisTask->FonComplete((TObject*)thisTask);
}
}
}
void submit(PoolTask *aTask){
aTask->myPool=this;
queue.push(aTask);
};
};
#endif
答案 1 :(得分:0)
您可以使用WinAPI线程工具或任何线程库,例如:boost / C++11 threading library,pthread,任何其他。
欢迎使用C ++进行多线程处理!