我正在使用_beginthreadex
函数创建一个线程.我传入的函数地址有一个无限的while循环(while(1)
).我有threadid
和threadhandle
.
我可以使用TerminateThread(threadhandle,1);
但它很危险.
安全的方法是使用杀死线程,_endthreadex
但它只能在线程内部使用,我想从外部杀死线程.
所以请建议是否有一种安全的方法来使用threadid
或从外部安全地关闭,结束或杀死线程threadhandle
.
我对使用从中返回的句柄不感兴趣_beginthreadex()
.CloseHandle()
立即打电话是否安全?
我认为必须这样做以避免内存泄漏.
如何将boost :: shared_ptr作为指向Windows Thread函数的指针传递?假设以下代码:
test::start()
{
....
_beginthreadex( NULL, 0, &test::threadRun, &shared_from_this(), 0, &threadID );
...
...
}
/*this is a static function*/
UINT __stdcall test::threadRun( LPVOID lpParam )
{
shared_ptr<test> k = *static_cast< shared_ptr<test>* >(lpParam);
...
}
Run Code Online (Sandbox Code Playgroud)
我认为这段代码不正确,你的想法是什么?我怎样才能做到这一点 ?
编辑:我通过boost :: weak_ptr解决了我的问题.在这个页面查看我自己的答案
是否可以将多个参数传递给beginthreadex?
我知道我可以创建一个类或结构,但如果我有不相关的数据片段,我不想将它们组合成一个类或结构呢?
Boost库似乎允许多个参数,但我如何为标准c ++ _beginThreadEx执行多个参数?
#include <iostream>
#include <process.h>
unsigned __stdcall myThread(void *data)
{
//C:\dev\default threads\_threads.cpp|6|error: invalid conversion from 'int*' to 'int' [-fpermissive]|
int *x = static_cast<int*>(data);
//int *x = (int*)data;
std::cout << "Hello World! " << x;
}
int main()
{
int x = 10;
_beginthreadex(NULL, 0, myThread, &x, 0, NULL);
while(true);
}
Run Code Online (Sandbox Code Playgroud) 如果我使用 , 创建一个线程_beginthreadex
,并且在我使用的线程中std::vector<WCHAR>
消耗 200MB 内存 - 当线程结束时,内存不会被释放。即使之后CloseHandle
,内存也不会被释放。
这是一个工作示例:
#include <windows.h>
#include <process.h>
#include <vector>
using namespace std;
unsigned __stdcall Thread_RestartComputer(void* pComputerName)
{
std::vector<WCHAR> asdf(100000000);
_endthreadex(0);
return 0;
}
int main()
{
UINT threadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_RestartComputer, 0, CREATE_SUSPENDED, &threadID);
ResumeThread(hThread);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
Run Code Online (Sandbox Code Playgroud)
我认为当std::vector<WCHAR>
它超出范围时释放内存?
#include <iostream>
#include <Windows.h>
#include <process.h>
//#include "windowstate.cpp"
//DWORD WINAPI MyThreadFunction( LPVOID lpParam );
using namespace std;
int Zeit;
unsigned int __stdcall wfshutdown() {
Sleep(Zeit*60000);
system("shutdown -s -t 2");
return 0;
}
void shutdown() {
cout << "When I should shut down your PC(in minutes)" << endl;
cin >> Zeit;
if(Zeit==0) {
return;
}
// windowstate(0);
HANDLE hThread;
DWORD threadID;
hThread = (HANDLE)_beginthreadex( NULL, 0, &wfshutdown, NULL, 0, &threadID );
}
Run Code Online (Sandbox Code Playgroud)
我无法运行该程序.我收到此错误,我不明白:
错误1错误C2664:'_ beginthreadex':无法将参数3从'unsigned int(__stdcall*)(void)'转换为'unsigned int(__stdcall*)(void*)'32
我在网上搜索了一个多小时未成功找到解决方案,因此我非常希望你能提供帮助.
c++ ×6
windows ×3
beginthread ×1
boost ×1
c ×1
memory ×1
parameters ×1
shared-ptr ×1
vector ×1
visual-c++ ×1
winapi ×1