Threads -> Потоки -> ~.~

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
819
Я использую поток с циклом. Выгружаю значит скрипт, сворачиваю игру. Затем разворачиваю её и у меня чёрный экран. Цикл останавливаю через EVENT
Помогите сделать нормальный поток с остановкой цикла и завершением самого потока при отгрузке скрипта)

C++:
HANDLE event;

void ThreadProc(void* pParam) {
    while (WaitForSingleObject(event, 100) != WAIT_OBJECT_0)
    {
        // Anything actions in while
    }
    _endthread();
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;
     
        event = CreateEvent(NULL, FALSE, FALSE, NULL);
        _beginthread(ThreadProc, 0, NULL);
     
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
        {
            SF->initPlugin(mainloop, hModule);
        } break;
        case DLL_PROCESS_DETACH:
        {
            SetEvent(event);
        } break;
    }
    return TRUE;
}
 

CleanLegend

Известный
Всефорумный модератор
476
929
Создавай поток через CreateThread, записывая его хэндл и при выгрузке вырубай его через TerminateThread, либо сделай глобальную переменную, которая будет завершать цикл в потоке при изменении
 

redcode

🤔
Друг
144
1,258
C++:
HANDLE hThread, hStopEvent;
DWORD WINAPI ThreadProc(LPVOID)
{
    // ...
    while (WaitForSingleObject(hStopEvent, 100) == WAIT_TIMEOUT) // 100 - задержка
    {
        // ...
    }
    // ...
    ExitThread(0);
}

void CALLBACK PluginFree()
{
    SetEvent(hStopEvent);
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    CloseHandle(hStopEvent);
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized()) return;
    
        hStopEvent = CreateEventA(NULL, TRUE, FALSE, NULL);
        hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, 0);
        
        SF->getGame()->registerGameDestructorCallback(PluginFree);
    
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
819
C++:
HANDLE hThread, hStopEvent;
DWORD WINAPI ThreadProc(LPVOID)
{
    // ...
    while (WaitForSingleObject(hStopEvent, 100) == WAIT_TIMEOUT) // 100 - задержка
    {
        // ...
    }
    // ...
    ExitThread(0);
}

void CALLBACK PluginFree()
{
    SetEvent(hStopEvent);
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    CloseHandle(hStopEvent);
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized()) return;
  
        hStopEvent = CreateEventA(NULL, TRUE, FALSE, NULL);
        hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, 0);
      
        SF->getGame()->registerGameDestructorCallback(PluginFree);
  
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
48640

при выходе из игры она намертво зависает
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
819
В этом случае причиной зависания игры является код, который находится в цикле.
там есть несколько sleep
В этом случае причиной зависания игры является код, который находится в цикле.
с пустым циклом тоже зависает
 
Последнее редактирование: