1

Тема: Як викликати метод одного потоку з іншого?

Є 1й потік (аля Атачі DLL а саме DllMain) і він створює ще потік через _beginthread.
І ще э хук функции WndProc.
WndProc визиваеться в першому потоці (той же що і DllMain) і тут питання.
Як з WndProc викликати функцію так щоб її виконав потік який був створений?
Просто якщо на пряму то буде краш. Пробував робити BOOL перемененную і міняти її в 1 потоці а в другому перевіряти її значення. Воно та якось працює але глючно і це говнокод кажись.

2 Востаннє редагувалося Betterthanyou (26.09.2017 15:07:01)

Re: Як викликати метод одного потоку з іншого?

vtorgashov написав:

Пробував робити BOOL перемененную і міняти її в 1 потоці а в другому перевіряти її значення.

Можливо вам потрібні Critical Section, Mutex або Semaphore
Ви стикнулися з проблемою яка називається race condition
https://replace.org.ua/extensions/om_images/img/59ca4ed886ed4/race-condition@2x-8b11b31d.png

vtorgashov написав:

створює ще потік через _beginthread

В С++ є свої засоби для створення (і керування) потоків. Можливо вам пригодиться
http://en.cppreference.com/w/cpp/langua … e_duration
http://www.cplusplus.com/reference/multithreading/

Подякували: LoganRoss, leofun012

3

Re: Як викликати метод одного потоку з іншого?

Для цього потрібна подія (CreateEvent) та потоко-захищена реалізація звичайної черги. В чергу додаєте структуру, яка описує дію, яку необхідно виконати, і кидаєте подію. Другий потік перевірить стан події коли звільниться. Якщо він знайде в черзі опис дії, то виконає її. Подію можна перевіряти періодично, а можна й безкінечно чекати, поки не з'явиться. Один з прикладів реалізації цього механізму - це стандартний механізм повідомлень у вінді (SendMessage).

4

Re: Як викликати метод одного потоку з іншого?

А _beginthread и мутекс буде працювати ?

5

Re: Як викликати метод одного потоку з іншого?

Має..., приклад тут https://stackoverflow.com/questions/784 … -incorrect

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;

void addQuery(void *v );

HANDLE ghMutex;
int counter = 0;

int main()
{
    HANDLE hs[5];
    ghMutex = CreateMutex( NULL, FALSE, NULL);         
    for(int i=0; i<5; ++i)
    {
        hs[i] = (HANDLE)_beginthread(addQuery, 0, NULL);
        if (hs[i] == NULL) 
        {
            printf("error\n"); return -1;
        }
    }

    printf("WaitForMultipleObjects return: %d error: %d\n",
         (DWORD)WaitForMultipleObjects(5, hs, TRUE, INFINITE), GetLastError());


    return 0;
}

void addQuery(void *v)
{
    WaitForSingleObject(ghMutex, INFINITE);

    cout << counter << endl;
    counter++;

    ReleaseMutex(ghMutex);
    _endthread();
}
Подякували: Fox, leofun012

6 Востаннє редагувалося Torbins (27.09.2017 20:43:04)

Re: Як викликати метод одного потоку з іншого?

vtorgashov написав:

А _beginthread и мутекс буде працювати ?

Якщо ви хочете створити потік, то _beginthread, чи його аналоги, вам знадобляться у будь-якому випадку.
Якщо у вас взаємодіють лише два потоки, то різниці між мютексом та подією (Event) майже немає. Відрізнятимуться лише функції й методи, які треба викликати.

Betterthanyou
Тут мабуть варто пояснити, що даний приклад демонструє зміну одного ресурсу одразу з декількох потоків. У даному випадку змінюється значення counter. Робота з цією змінною захищена мютексом за допомогою функцій WaitForSingleObject та ReleaseMutex. У цьому прикладі показане лише одне з можливих застосувань мютекса.

Подякували: Betterthanyou, leofun012

7

Re: Як викликати метод одного потоку з іншого?

Так, на msdn можна знайти більше інформації
Наприклад https://msdn.microsoft.com/uk-ua/librar … s.85).aspx