[pso] Probleme Threaduri in C++
Gabriel Bercea
gamitech at gmail.com
Sun May 17 22:40:56 EEST 2009
Si cand luati aplicatia cu debuggerul cu F10..... ce se intampla imediat
dupa ce se termina device_discovery ? Check registers....
In ce consta functia device_discovery... ?
Vedeti daca apelati vreo funtie dintr-un DLL sa fie declarata corect in
header, incluzand WINAPI (__stdcall), daca nu e declarata asa nu se salveaza
ESP p stiva la return din functie, si poate cauza serious problems.
Alta pbema nu pot decat sa o vad in functia device_discovery. Comentati
functia asta si vedeti comportamentul.
Interactioneaza catusi de putin cu ceva hware. Faceti totul sicron.
2009/5/17 ovidiu popa <ov.popa at gmail.com>
> O sa incerc sa fiu ceva mai explicit. Partea asta a aplicatiei se ocupa cu
> descoperirea unor device-uri de bluetooth. Apoi se realizeaza conexiuni
> catre aceste device-uri si se asteapta primirea de conexiuni.
>
> Comportamentul aplicatiei este urmatorul:
> - se porneste un thread principal care va initializa toate celelate
> threaduri
> - se pornesete un thread care face device discovery (dureaza vreo 20 de
> secunde partea asta)
> - se porneste un thread pt scriere de mesaje catre peers
> - se porneste un thread care asteapta mesajele
>
> threadurile de read si de write se realizeaza in bucle si nu ar trebui sa
> se termine.
>
> Threadul principal porneste toate aceste threaduri.
> Totul e bine si frumos pana se termina functia de device discovery.
>
> Threadurile aratate de visual studio pana se strica sunt dupa cum urmeaza:
>
> Id name Location
>
> f667bf36 WinMainCRTStartup 0x88045644
> 376314918 Client::connectToDevices 0x88045644
> 915888562 DeviceFinder::FindDevices
> DeviceFinder::FindDevices
> 912841594 MessageReader::readMessages 0x88045644
> 1991455818 MessageWriter::writeMessages 0x88045644
>
>
> Problema apare in momentul in care threadul care face device discovery
> termina functia asociata. Cand se iese din functie thread-ului se intampla
> o chestie dubioasa dupa cum urmeaza:
>
> Threadul de find Devices dispare dupa cum e normal. Problema apare ca
> threadul de MessageReader se transforma in message writer, dupa cum
> urmeaza:
>
> Id name Location
>
> f667bf36 WinMainCRTStartup 0x88045644
> 376314918 Client::connectToDevices 0x88045644
> 912841594 MessageWriter::writeMessages 0x88045644
> 1991455818 MessageWriter::writeMessages 0x88045644
>
> Dupa inca o intructiune dispare cu totul threadul care inainte era reader
> .
>
> Cam de la ce ar putea sa fie? Noi ne gandim ca e de la o problema cu
> memoria, ca suprascriem vreo adresa de intoarecere sau corupem ceva...
>
> Stie cineva vreun tool util pt visual studio? Noi am incerca Application
> Verifier de la microsoft da nu am descoperit cine stie ce :(
>
> Merci de ajutor
>
> 2009/5/17 Gabriel Bercea <gamitech at gmail.com>
>
> 1) Nu iesiti din thread cu exit thread si doar cu return
>> 2) Sa nu aveti peding operations asociate cu threadul
>> 3) Cum iti dai seama ca nu s-a terminat threadul ? cum testezi asta ?
>>
>>
>> finally, din explicatia data initial nu inteleg de fapt care e pbema, si
>> nici comportamentul aplicatiei ??
>> ai 5 threaduri, p care le pornesti si au fiecare cate un StartRoutine sau
>> 5 start routines diferite ? Please be a little more concrete
>>
>>
>>
>>
>> 2009/5/17 Alexandru Bleotu <alexbleotu at gmail.com>
>>
>> Threadul principal nu moare... mai mult doua dintre threaduri continua...
>>> banuim ca este vorba despre memory corruption
>>>
>>> 2009/5/17 Mircea Bardac <cs at mircea.bardac.net>
>>>
>>> Salut,
>>>>
>>>> ovidiu popa wrote:
>>>> > Am o aplicatie in C++ care porneste 5 threaduri.
>>>> > In momentul in care functia asociata unui thread ajunge la sfarsitul
>>>> > executiei se incheie executia si a altui thread care ar trebui sa
>>>> ruleze o
>>>> > bucla infinita...
>>>>
>>>> Nu sunt convins ca am inteles bine problema asa ca o sa reformulez un
>>>> pic: cand se termina thread-ul 1, observi ca s-a terminat si thread-ul 2
>>>> cu toate ca thread-ul 2 ar trebui inca sa mai ruleze.
>>>>
>>>> O idee: verifica faptul ca in thread-ul principal (acolo unde creezi
>>>> cele 2 thread-uri) astepti ambele thread-uri, nu doar thread-ul 1
>>>> (WaitForSingleObject/WaitForMultipleObjects). Daca astepti doar
>>>> thread-ul 1, thread-ul principal isi va continua executia => aplicatia
>>>> se va termina (ExitProcess) => toate thread-urile aplicatiei vor fi
>>>> terminate.
>>>>
>>>> Good luck.
>>>>
>>>> --
>>>> Mircea
>>>> http://mircea.bardac.net
>>>> _______________________________________________
>>>> pso mailing list
>>>> pso at cursuri.cs.pub.ro
>>>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>>>>
>>>
>>>
>>> _______________________________________________
>>> pso mailing list
>>> pso at cursuri.cs.pub.ro
>>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>>>
>>>
>>
>> _______________________________________________
>> pso mailing list
>> pso at cursuri.cs.pub.ro
>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>>
>>
>
> _______________________________________________
> pso mailing list
> pso at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20090517/9a5abca5/attachment.htm>
More information about the pso
mailing list