标签: beginthreadex

如何安全地关闭其中有无限循环的THREAD

我正在使用_beginthreadex函数创建一个线程.我传入的函数地址有一个无限的while循环(while(1)).我有threadidthreadhandle.

我可以使用TerminateThread(threadhandle,1);但它很危险.

安全的方法是使用杀死线程,_endthreadex但它只能在线程内部使用,我想从外部杀死线程.

所以请建议是否有一种安全的方法来使用threadid或从外部安全地关闭,结束或杀死线程threadhandle.

c c++ winapi multithreading beginthreadex

8
推荐指数
3
解决办法
4706
查看次数

在_beginthreadex()成功后我可以立即调用CloseHandle()吗?

我对使用从中返回的句柄不感兴趣_beginthreadex().CloseHandle()立即打电话是否安全?

我认为必须这样做以避免内存泄漏.

c++ windows multithreading visual-c++ beginthreadex

7
推荐指数
1
解决办法
3477
查看次数

如何将boost :: shared_ptr作为指向Windows Thread函数的指针传递?

如何将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解决了我的问题.在这个页面查看我自己的答案

c++ windows boost shared-ptr beginthreadex

5
推荐指数
1
解决办法
1397
查看次数

将多个参数传递给_beginThreadEx

是否可以将多个参数传递给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)

c++ windows parameters multithreading beginthreadex

1
推荐指数
1
解决办法
3350
查看次数

std::vector 不会释放线程中的内存

如果我使用 , 创建一个线程_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>它超出范围时释放内存?

c++ memory multithreading vector beginthreadex

1
推荐指数
2
解决办法
197
查看次数

无法使用_beginthreadex编译C++程序

#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++ multithreading beginthread beginthreadex

0
推荐指数
1
解决办法
1666
查看次数