Wątki MFC

1

Witam. Mam sobie metode w klasie i chce zeby ona byla wykonywana w osobnym watku. Co powinienem zrobic, jakich klas uzyc aby to osiagnac? Pisze w C++ / MFC.

0

Najlatwiej chyba tak:

.h

static UINT Watek(LPVOID param);

typedef struct THREADSTRUCT
{
    CMojKlasa *_this;
} THREADSTRUCT;

.cpp

void CMojaKlasa::Start()
{
    THREADSTRUCT *param = new THREADSTRUCT;
    param->_this = this;
    /**/ AfxBeginThread(Watek,param);
}

UINT Watek(LPVOID param)
{
    THREADSTRUCT *ts = (THREADSTRUCT)param;
    ts->_this->MojaFunkcjaWOsobnymWatku();

    // AfxEndThread lub
    return 1;
}
0

Wielkie dzieki. Swojadroga mogli jakos lepiej oto rozwiazac. W ogole to MFC jakies takie nie bardzo jest.

0

Kwestia wprawy. Ja jeszcze nie spotkalem sie z zadnym problemem ze strony mfc, wrecz ta biblioteka swietnie ulatwia pisanie programow.

Ja podalem tylko jeden ze sposobow. Jeszcze istnieje cos takiego jak CWinThread i _beginthread :)

0

Mam teraz taki problem - metoda ktora mialem umiescic w watku jest wywolywana rekurencyjnie (przeszukiwanie dyskow) - co mam z tym zrobic? Metoda pobiera jako parametr CString bedacy sciezka.

0

Ok poradziwlem sobie z tym, ale mam kolejne pytanie. Jako parametr podajesz wskaznik na obiekt klasy THREADSTRUCT utworzony za pomoca new. Nie widze natomiast zebys go gdziekolwiek niszczyl za pomoca delete. Mozesz napisac gdzie powinno to sie odbywac? Probowalem utworzc strukturke na stosie ale oczywiscie nie dziala to bo po rozpoczeciu watku obiekt jest niszczony i wskaznik na THREADSTRUCT jest nieaktualny. Prosze o pomoc.

0

A takie cos mowi dokumentacja:

Terminating a thread prematurely is almost as simple: Call AfxEndThread from within the thread. Pass the desired exit code as the only parameter. This stops execution of the thread, deallocates the thread's stack, detaches all DLLs attached to the thread, and deletes the thread object from memory.

To chyba rozwiazuje czesc problemow.
Wiem, moj kod nie wyglada najladniej, ale chodzilo o najprostsze wykorzystanie watkow.

BTW: Mala poprawke wrzucilem do kodu. Jakis bezsens tam wpisalem przy AfxBeginThread :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1