这些天来,我正在尝试了解有关 Windows 中线程的更多信息。我想过做这个实际的应用程序:
假设按下“开始”按钮时启动了多个线程。假设这些线程是密集的(它们一直在运行/总是有一些工作要做)。
这个应用程序还有一个“停止”按钮。当按下此按钮时,所有线程都应该以一种很好的方式关闭:释放资源并放弃工作并返回它们在按下“开始”按钮之前的状态。
该应用程序的另一个要求是线程运行的函数不应包含任何检查“停止”按钮是否被按下的指令。线程中运行的函数不应该关心停止按钮。
语言:C++
操作系统:Windows
问题:
WrapperFunc(function, param)
{
// what to write here ?
// if i write this:
function(param);
// i cannot stop the function from executing
}
我应该如何构造包装函数以便可以正确停止线程?(不使用 TerminateThread 或其他一些功能)
如果程序员动态分配一些内存怎么办?如何在关闭线程之前释放它?(请注意,当我按下“停止按钮”时,线程仍在处理数据)我想重载新运算符或只是强加使用预定义函数以在动态分配内存时使用. 然而,这意味着使用这个 api 的程序员受到了限制,这不是我想要的。
谢谢
编辑:骨架来描述我想要实现的功能。
struct wrapper_data
{
void* (*function)(LPVOID);
LPVOID *params;
};
/*
this function should make sure that the threads stop properly
( free memory allocated dynamically etc )
*/
void* WrapperFunc(LPVOID *arg)
{
wrapper_data *data = (wrapper_data*) arg;
// what to write here ?
// if i write this:
data->function(data->params);
// i cannot stop the function from executing
delete data;
}
// will have exactly the same arguments as CreateThread
MyCreateThread(..., function, params, ...)
{
// this should create a thread that runs the wrapper function
wrapper_data *data = new wrapper_data;
data->function = function;
data->params = params;
CreateThread(..., WrapperFunc, (LPVOID) wrapper_data, ...);
}
thread_function(LPVOID *data)
{
while(1)
{
//do stuff
}
}
// as you can see I want it to be completely invisible
// to the programmer who uses this
MyCreateThread(..., thread_function, (LPVOID) params,...);