Toon posts:

[W32|C] Thread blokt op windows functies

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een programma aan het maken m.b.v. threads. Dit programma scant bestanden, wat ik dus door meerdere threads wil laten doen. Nu blocken de threads op standaard windows-functies, zoals UpdateWindow en ListView_SetItem. Als ik de aanroepen tot deze functies in commentaar zet, werkt het wel redelijk.

Het programma draait ook niet meer verder (te zien aan debug-output), hij lijkt voor altijd te blocken. Hoe komt dit en wat kan ik hier aan doen?

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Wacht de thread waarin je window draait waarop deze functies aangeroepen worden op de thread(s) die deze functies daadwerkelijk aanroepen? Als dat zo is kan het zijn dat deze functies wachten tot de messages die zij versturen ook daadwerkelijk geprocessed zijn door de winproc van het window waar ze heen gestuurd worden (dit heb je ook als je zelf handmatig ::SendMessage() aanroept). Als de thread waarin de winproc draait op dat moment aan het wachten is op de thread die de functie aanroep deed dan staan ze vanaf dat moment dus op elkaar te wachten en heb je een deadlock.

Een andere verklaring zou ik zo gauw even niet kunnen bedenken.

Verwijderd

Topicstarter
Ja, de thread die de messages afhandelt wacht inderdaad totdat de andere threads klaar zijn. Het zal wel zoiets zijn als jij zegt, maar hoe los ik het op?

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Verwijderd schreef op 03 oktober 2004 @ 12:12:
Ja, de thread die de messages afhandelt wacht inderdaad totdat de andere threads klaar zijn. Het zal wel zoiets zijn als jij zegt, maar hoe los ik het op?
... die message thread niet meer laten wachten ;)
Laat je k worker threads gewoon een message posten op de message queue. Bij ontvangst van de k-e messages ga je de handeling uitvoeren die met het klaar zijn te maken heeft.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • JeroenB
  • Registratie: November 1999
  • Laatst online: 10-07 20:20
Ook belangrijk om te weten is dat je GUI-acties moet uitvoeren in de GUI-thread, niet vanuit andere threads. Daarvandaan kun je wel messages versturen of events in de GUI-thread raisen die de gewilde acties uitvoeren.

In .NET hebben we daar tegenwoordig zo'n comfortabele InvokeRequired-member voor die aangeeft of je op de goeie thread zit of dat je moet raisen. In C zul je dat zelf moeten uitzoeken (maar aangezien je duidelijk gedefinieerde workerthreads hebt lijkt me dat niet al te lastig).