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

2 operacije istovremeno

[es] :: C/C++ programiranje :: 2 operacije istovremeno

[ Pregleda: 1991 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nibble

Član broj: 63173
Poruke: 302
*.dlp260.bih.net.ba.



+1 Profil

icon 2 operacije istovremeno25.01.2006. u 14:34 - pre 221 meseci
Napravio sam jedan program koji sluzi za chatanje.
I u njemu je jedna funkcija void GetData koja sluzi da primi sve sto posalje drugi client naravno preko winsocka.Onda ta funkcija
prosledjuje drugoj funkciji void Razvrstaj(char *data) koja razvrstava sta je client poslao npr. ako je poslao info--
onda ta ona salje informacije o system-u itd. nazad clientu.Problem je u tome kada treba raditi
2 operacije istovremeno.Npr kada Razvrstaj poziva neku trecu funkciju u kojoj ima while petlja a
ta petlja se prekida kada se client posalje "stop" i onda GetData ne moze nista primiti dok ta petlja radi.
Zna li ko kako da rjesim ovaj problem i da mogu raditi vise operacija istovremeno.
Ovaj progi je konzolan i radim ga u C-u.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: 2 operacije istovremeno25.01.2006. u 16:44 - pre 221 meseci
Resenje za tvoje muke se zove multithreading.

Treba da kreiras dva tzv. worker thread-a, jedan da nadgleda pristigle poruke (nazovimo
ga receive thread), drugi da opsluzuje poslate poruke (nazovimo ga send thread) i da ih salje niz mrezu.

Mali problem je kontakt ovih thread-ova sa GUI-jem. Samo glavni thread (main thread)
moze da pristupa GUI elementima.

Kako bi izgledao dizajn koda:

Trebaju ti definicije za dve custom-poruke, naprimer:
Code:

#define WM_RECEIVED_DATA    (WM_USER+1)
#define WM_SENDING_DATA     (WM_USER+2)


Kad god receive thread primi podatke, on salje custom-definisanu poruku glavnom
thread-u, i to treba da ih salje asinhrono, samo upisujuci poruku u message loop, bez
da ceka da se poruka opsluzi. Za ovu svrhu koristi PostMessage( ) funkciju. Glavna
aplikacija treba da ima handler (ON_COMMAND(WM_RECEIVED_DATA....).

Kad korisnik nesto ukuca u svoj edit box, glavni thread na to reaguje svojim handlerom
za taj edit box, skida podatke sa edit box-a i smesta ga u neki unapred rezervisani
buffer u memoriji. Odmah potom, salje custom-definisanu poruku send thread-u, takodje
koristeci PostMessage( ) funkciju.

Za razliku od receive thread-a, send thread mora da ima aktiviranu message pumpu,
koja je vec ugradjena, samo je treba eksplicitno aktivirati.

Ako nemas iskustva sa thread-ovima, kukaj naglas, pa cemo korak po korak da resimo
problem.


 
Odgovor na temu

Nibble

Član broj: 63173
Poruke: 302
*.dlp294.bih.net.ba.



+1 Profil

icon Re: 2 operacije istovremeno25.01.2006. u 16:47 - pre 221 meseci
raskuko sam se pravo :)
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: 2 operacije istovremeno25.01.2006. u 16:51 - pre 221 meseci
Malo kasno sam primetio da pises konzolni program u C-u.

U tom slucaju, principi ostaju isti: i dalje ti trebaju dva thread-a, jedino zaboravi pricu
oko custom poruka, main thread-a, ON_COMMAND.

Thread-ove kreiraj sa CreateThread( ) funkcijom. Pogledaj MSDN za detalje.

Takodje, u konzolnom okruzenju, svaki thread moze da printuje na ekran bez nekih
specijalnih ogranicenja, jedino se ne moze koristiti printf, koji nije thread-safe (tj. niko
ne garantuje da jedan thread nece upasti usred printovanja iz drugog thred-a.

Umesto printf-a koristi ovo:
Code:

HANDLE hConsoleOut;
DWORD dummy;
char errbuf[512];

hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE);
wsprintf(errbuf, "Evo neke test poruke...\n");
WriteFile(hConsoleOut, 
      errbuf, 
      strlen(errbuf), 
      &dummy,
      FALSE);


[Ovu poruku je menjao milanche dana 25.01.2006. u 17:54 GMT+1]
 
Odgovor na temu

Nibble

Član broj: 63173
Poruke: 302
*.dlp294.bih.net.ba.



+1 Profil

icon Re: 2 operacije istovremeno25.01.2006. u 16:56 - pre 221 meseci
Hvala ti milanche!
 
Odgovor na temu

[es] :: C/C++ programiranje :: 2 operacije istovremeno

[ Pregleda: 1991 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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