[ ljube @ 28.08.2004. 16:32 ] @
Zelio bi da posaljem SetTimer i da ga obradim u thrad funkciji koja je kreirana sa CreateThread.
Da li neko zna za primjer kako ovo uraditi bez upotrebe MFC-a, znaci samo sa API pozivima.
Thread funkcija bi trebalo da obradi WM_TIMER poruku ali kako poslati tu poruku samo tom thredu.

Ljubisa
[ Dragi Tata @ 28.08.2004. 17:03 ] @
1. Izbegavaj CreateTimer() i koristi _beginthreadex()

http://www.mtholyoke.edu/courses/dstrahma/cs322/lab3andproj.htm

2. Moraćeš da hvataš WM_TIMER poruke u toj funkciji, što znači da moraš da imaš Message Loop u njoj.
[ ljube @ 28.08.2004. 17:22 ] @
OK, mislim da neće biti veliki huruški zahvat da ubacim _beginthreadex() umjesto BeginThread, ali kako da pošaljem poruku SetTimer baš određenoj thread proceduri?

Prvi parametar sa SetTimer je HWND a thredovi koje koristim nemaju HWND.


Pretpostavljam da bih mogao da cekam WM_TIMER sa ovakvim loop-om
Code:

while (GetMessage(&msg, NULL, 0, 0)) 
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }


Inače riječ je o RS232 programu koji treba u odredjeno vrijeme da šalje karaktere na COM port.
[ Dragi Tata @ 28.08.2004. 18:02 ] @
Citat:
ljube:
Inače riječ je o RS232 programu koji treba u odredjeno vrijeme da šalje karaktere na COM port.


Mislim da bi u tvom slučaju bilo bolje da koristiš MM timere. Pogledaj:

http://www.codeproject.com/system/timers_intro.asp#MMTimers
[ ljube @ 28.08.2004. 18:15 ] @
Nije mi toliko bitna rezoulcija koju koriste MM timer-i. Dovoljne su mi i ms koje pruza varijanta SetTimer ali i dalje ne znam kako da tu poruku posaljem bas odredjenom thredu.
Znam da je moguce u MFC thredovima, ali...

Nema veze, rjesicu taj problem nekako.

Evo jos jedno pitanje u vezi thredova ...

Ako imam 10 otverenih therdova i svi oni pozivaju jednu funkciju.
Funkcija inace odsjeca dijelove buffera(string) koji prosledjuju thred-ovi ali abog kompleksnosti kopira taj buffer u neke lokalne varijable.
Kako da budem siguran da nece doci do mijesanja podataka prilikom poziva te zajedniceke funkcije.
Da li moram da koristim neke varijante sinhronizacije ili je u principu sigurno da razliciti thredovi pozivaju istu funkciju kao na primjer neke od Windows API funkcija.
Da li je samo stvar u deklarisanju varijabli te funkcije.
Znam da bi bio problem sa varijablama koje su onzacene kao static.

Jednom sam pravio eksperiment i svim varijablama dodjelio "storage specifier" auto.

Prmimjer:
auto int a;
auto long b;
...

I onda sam modifikovao te varjijable pozivom iz raclicitih thredova i primjetio sam da se podaci ne mijesaju.

Obzirom da sam ja novajlija u MS C++, (dugo vremena koristim C i Win32 API) molim za neki savjet kako rade thredovi u C++ svijetu.


Pozdrav,
Ljubisa












[ Dragi Tata @ 28.08.2004. 18:29 ] @
MM timere ti nisam preporučio zbog rezolucije, već zbog činjenice da se timer fnkcije automatski izvršavaju u posebnoj niti, pa ne treba ni da se baviš _beginthreadex-om i sličnim stvarima.

Što se tiče lokalnih promenljivih, nemaj brige. Svaka nit ima svoj stek, a lokalne promenljive idu na stek.
[ ljube @ 28.08.2004. 18:57 ] @
Hvala!
Prilicno me brinulo ovo sa thredovima. Obraticu paznju i na MM timere.

Pozdrav,
Ljubisa
[ blaza @ 28.08.2004. 19:43 ] @
Citat:
ali kako da posaljem poruku SetTimer bas odredjenoj thread proceduri

Mozda nesto ovako:
Code:

void thread_proc(void*){
    HWND h_wnd = ... //kreiras nevidljiv prozor ili dijalog
    if(!h_wnd)
        return; //prozor nije kreiran
    SetTimer(h_wnd, TIMER_ID, 1000 /* period */, NULL);
    MSG msg;
    hwnd = h_wnd; //preneses window handle glavnom thread-u, da bi mogao da 
              //salje poruke ovom thread-u (npr. WM_BYE_BYE)
    while(true){
        if(PeekMessage(&msg, h_wnd, 0, 0, PM_REMOVE)){
            switch(msg.message){
                case WM_BYE_BYE:
                    KillTimer(h_wnd, TIMER_ID);
                    DestroyWindow(h_wnd);
                    return;
                case WM_TIMER:
                    if(msg.wParam == TIMER_ID)
                        //slanje karaktera na RS232 port
                    
                ...
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
            sleep(50); //ovo nije bas najsrecnije resenje;
    }
}