Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Threading problem (win32 api)

[es] :: C/C++ programiranje :: Threading problem (win32 api)

[ Pregleda: 1574 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Threading problem (win32 api)08.05.2005. u 12:56 - pre 230 meseci
ne mogu da provalim zasto ovo ne radi... debagujem ceo dan... ubih se... ovo je moj prvi pokusaj multithreading aplikacije a primere u C-u ne mogu da nadjem nigde, a oni u ASM mi ne pomazu mnogo...

Izostavio sam kod koji je nebitan tako da ce postojanje threada izgledati besmisleno... thread dok se izvrsava treba da promeni text jedne labele u glavnom dialogu. Thread se pokrece i pravi direktorijum ali onda pukne/izadje u zavisnosti od toga da li je return TRUE ili samo return... ako direktorijum vec postoji onda bi trebala da se pozove funkcija SetDlgItemText (i ona radi OK kada se pozove) ali program opet nakon toga pukne ako je return FALSE ili izadje ako je samo return???

Code:

#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
DWORD CALLBACK ThreadProc(LPVOID lpParameter);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;

    DialogBoxParam(hInstance, (LPCTSTR)IDD_MAIN, NULL, (DLGPROC)WndProc, 0);

    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HANDLE hThread;

    switch(message)
    {
        case WM_INITDIALOG:
                return TRUE;
                
        case WM_COMMAND:
            if(LOWORD(wParam)==IDC_START)
            {
                hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc(hWnd), NULL, NORMAL_PRIORITY_CLASS, NULL);
//                WaitForSingleObject(hThread, INFINITE);  nemama pojma da li mi je ovo potrebno.. mislim da nije ali sam ipak probao
                CloseHandle(hThread);
                return TRUE;
            }
            else if(LOWORD(wParam)==IDC_EXIT)
            {
                EndDialog(hWnd, 0);
                return TRUE;
            }

        case WM_DESTROY:
            PostQuitMessage(0);
            break;
            
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return FALSE;
}

DWORD CALLBACK ThreadProc(LPVOID lpParameter)
{
    char szDirPath[]="c:\\MPC\\";
//    DWORD dExitCode;

    if(!CreateDirectory(szDirPath, NULL))
    {
        SetDlgItemText(lpParameter, IDC_STATUS, "Couldn't create new directory.");
//        GetExitCodeThread(hThread, &dExitCode);
//        TerminateThread(hThread, dExitCode);
        return; //ako je ovo return TRUE program pukne
    }

    return TRUE; //i ovde puca, ako je samo return onda program izadje ???
}


negde sam procitao da threading funkcija mora da se deklarise kao DWORD CALLBACK ime(LPVOID lpParameter)
verovatno nesto bitno propustam ali nemam pojma sta???
nemam pojma ni cemu sluze return vrednosti posto se sama funkcija poziva unutar CreateThread?
 
Odgovor na temu

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Re: Threading problem (win32 api)08.05.2005. u 13:23 - pre 230 meseci
ovde je greska:

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc(hWnd), NULL, NORMAL_PRIORITY_CLASS, NULL);

a treba da bude:

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, hWnd, NORMAL_PRIORITY_CLASS, NULL);

Mozda pored ovoga jos negde gresim mada sve radi... i dalje me zanima cemu sluze return vrednosti moje funkcije i da li threading funkcija moze da bude void?

P.S. zasto ne mogu da obrisem poruku??? hteo sam prvu poruku da obrisem cime bi cela tema nestala i nisam mogao: samo moderatori i administratori (ali tema je moja)???
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Threading problem (win32 api)09.05.2005. u 08:36 - pre 230 meseci
Bolje ukini i kastovanje funkcije u LPTHREAD_START_ROUTINE. Return

vrednost funkcije mozes da ispitas sa GetExitCodeThread. Thread funkcija

ne moze da bude void, ali to i nije neki problem, samo stavi return 0 na

kraju funkcije. Ono sto je problem je ako napravis funkciju koja je void

i njom pozoves CreateThread ali kastujes funkciju u

LPTHREAD_START_ROUTINE. Uzgred, bolje je da umesto CreateThread koristis

_beginthreadex (za ne-MFC threadove) i AfxBeginThread (za MFC threadove)


Ne treba ti |WaitForSingleObject| odmah posle CreateThread, jer ce WFSO

da prodje tek kad se thread zavrsi. Ne treba ti GetExitCodeThread u

samom threadu (po prirodi stvari uvek ce da vrati STILL_ACTIVE). Nikako

ti ne treba TerminateThread ni u threadu ni van njega, thread treba da

se zavrsi prosto tako sto izadje iz thread funkcije.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Threading problem (win32 api)

[ Pregleda: 1574 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.