[C++] string doorgeven aan thread.

Pagina: 1
Acties:

  • The End
  • Registratie: Maart 2000
  • Laatst online: 16-09 11:56

The End

!Beginning

Topicstarter
Heeft iemand een simpele manier om dit op te lossen:

char *string = new char[5];
SendToThread(string);

In deze functie wordt een message gepost naar een thread met de pointer naar de string.
Nu is mijn probleem: Hoe kan je de string het beste weer deleten? In de huidige thread of in de thread waar die gepost wordt en wanneer...

Verwijderd

Ik denk dat je gewoon voor jezelf moet beslissen wie er in jouw mechanisme verantwoordelijk gaat zijn voor het opruimen, en dat dan consistent doorvoeren in je code.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik zou hem deleten in dezelfde thread als waar je hem hebt aangemaakt. Dan behoud je new/delete symmetrie. Maar dan moet je er wel zeker van zijn dat de andere thread het al gekopieerd heeft.

Deleten in de ontvangende thread is in dit geval misschien handiger, maar dan raak je het overzicht van new/deletes snel kwijt.

  • The End
  • Registratie: Maart 2000
  • Laatst online: 16-09 11:56

The End

!Beginning

Topicstarter
Op donderdag 06 december 2001 16:09 schreef OlafvdSpek het volgende:
Ik zou hem deleten in dezelfde thread als waar je hem hebt aangemaakt. Dan behoud je new/delete symmetrie. Maar dan moet je er wel zeker van zijn dat de andere thread het al gekopieerd heeft.

Deleten in de ontvangende thread is in dit geval misschien handiger, maar dan raak je het overzicht van new/deletes snel kwijt.
Ja, dit was ook mijn idee... Maar dan moet ie in de andere thread gekopieerd worden en daarna pas gedelete worden in de huidige thread. Om dat te doen heb ik weer een handle nodig...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op donderdag 06 december 2001 16:12 schreef The End het volgende:
Ja, dit was ook mijn idee... Maar dan moet ie in de andere thread gekopieerd worden en daarna pas gedelete worden in de huidige thread. Om dat te doen heb ik weer een handle nodig...
Dan zou ik het zo doen:
code:
1
SendToThread ( new CString ( /* blabla */ ) );

ben niet zo'n held in C++, dus het zal wel niet helemaal kloppen.

Op die manier behoud je wel de new / delete analogie, want je geeft de pointer naar de CString mee aan de thread, en geeft daarmee ook de verantwoordelijkheid voor die pointer aan de thread.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Of je schrijft een klasse die basic_string gebruikt en die het multi-threading safe maakt.

  • The End
  • Registratie: Maart 2000
  • Laatst online: 16-09 11:56

The End

!Beginning

Topicstarter
Op donderdag 06 december 2001 16:19 schreef drm het volgende:

[..]

Dan zou ik het zo doen:
code:
1
SendToThread ( new CString ( /* blabla */ ) );

ben niet zo'n held in C++, dus het zal wel niet helemaal kloppen.

Op die manier behoud je wel de new / delete analogie, want je geeft de pointer naar de CString mee aan de thread, en geeft daarmee ook de verantwoordelijkheid voor die pointer aan de thread.
Nee, niet echt... Dit komt eigenlijk op hetzelfde neer als wat ik eerst had. Ik hoef ook alleen een stringetje door te geven. Dan geef ik liever niet van die geheugen vretende objecten mee.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Zou veel geheugen zal CString echt niet vreten hoor.

  • The End
  • Registratie: Maart 2000
  • Laatst online: 16-09 11:56

The End

!Beginning

Topicstarter
Op donderdag 06 december 2001 16:19 schreef OlafvdSpek het volgende:
Of je schrijft een klasse die basic_string gebruikt en die het multi-threading safe maakt.
Dan moet het een globale klasse zijn... Heb ik ook liever niet.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op donderdag 06 december 2001 16:24 schreef The End het volgende:
Nee, niet echt... Dit komt eigenlijk op hetzelfde neer als wat ik eerst had. Ik hoef ook alleen een stringetje door te geven. Dan geef ik liever niet van die geheugen vretende objecten mee.
Nee, het verschil is, dat de pointer string bekend was in de parent-thread. In mijn geval niet. Dat bedoel ik met new/delete analogie.

Als je het teveel geheugen vind vreten maak je er zelf een wrappertje voor.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • The End
  • Registratie: Maart 2000
  • Laatst online: 16-09 11:56

The End

!Beginning

Topicstarter
Op donderdag 06 december 2001 16:26 schreef drm het volgende:

[..]

Nee, het verschil is, dat de pointer string bekend was in de parent-thread. In mijn geval niet. Dat bedoel ik met new/delete analogie.

Als je het teveel geheugen vind vreten maak je er zelf een wrappertje voor.
Ja, dat zou wel zo zijn als die functie de message meteen poste... Maar die functie bevat weer dit:

bool SendThreadMessage(LPSTR StringToWrite)
{
if (PostThreadMessage(WriteThreadID, PWM_COMMWRITE,(WPARAM)SizeofStringToWrite, (LPARAM)StringToWrite))
{
return true;
}
else
return false;
}

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op donderdag 06 december 2001 16:26 schreef The End het volgende:

[..]

Dan moet het een globale klasse zijn... Heb ik ook liever niet.
Zonder globale klasse kan het ook wel hoor.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op donderdag 06 december 2001 16:34 schreef The End het volgende:

[..]

Ja, dat zou wel zo zijn als die functie de message meteen poste... Maar die functie bevat weer dit:

bool SendThreadMessage(LPSTR StringToWrite)
{
if (PostThreadMessage(WriteThreadID, PWM_COMMWRITE,(WPARAM)SizeofStringToWrite, (LPARAM)StringToWrite))
{
return true;
}
else
return false;
}
Daar heb je inderdaad een goed punt.

Maar dan heb je ook meteen je eigen vraag beantwoord.

Want in het geval dat de SendToThread() mislukt, moet je de string ook in de huidige thread deleten. :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • The End
  • Registratie: Maart 2000
  • Laatst online: 16-09 11:56

The End

!Beginning

Topicstarter
Op donderdag 06 december 2001 16:40 schreef drm het volgende:

[..]

Daar heb je inderdaad een goed punt.

Maar dan heb je ook meteen je eigen vraag beantwoord.

Want in het geval dat de SendToThread() mislukt, moet je de string ook in de huidige thread deleten. :)
Ja, maar het kan ook in uitzonderlijke gevallen voorkomen dat de message niet aankomt bij de thread... De oplossing die ik zoek, moet in alle gevallen goed werken.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op vrijdag 07 december 2001 09:50 schreef The End het volgende:
Ja, maar het kan ook in uitzonderlijke gevallen voorkomen dat de message niet aankomt bij de thread... De oplossing die ik zoek, moet in alle gevallen goed werken.
In alle gevallen is dus ook in het geval dat het fout gaat.
Dan zou ik dus zeggen, doe het deleten in de thread die de message verzend.

Want anders krijg je dat je in het ene geval hem moet deleten in de zender, en als het goed gaat in de andere.

Daar kun je dan beter consequent in zijn.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op donderdag 06 december 2001 16:34 schreef The End het volgende:

[..]

Ja, dat zou wel zo zijn als die functie de message meteen poste... Maar die functie bevat weer dit:

bool SendThreadMessage(LPSTR StringToWrite)
{
if (PostThreadMessage(WriteThreadID, PWM_COMMWRITE,(WPARAM)SizeofStringToWrite, (LPARAM)StringToWrite))
{
return true;
}
else
return false;
}
1) Die if is niet nodig; je kunt gewoon return Post...() doen.
2) Dit maakt acuut duidelijk dat je de delete niet in de andere thread kunt doen. Als de Post faaltheb je een meory leak.
3) Ik denk dat een ref-counted string class hier het beste is. Meer details daarover nodig ?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • The End
  • Registratie: Maart 2000
  • Laatst online: 16-09 11:56

The End

!Beginning

Topicstarter
Op vrijdag 07 december 2001 14:45 schreef MSalters het volgende:

[..]

1) Die if is niet nodig; je kunt gewoon return Post...() doen.
2) Dit maakt acuut duidelijk dat je de delete niet in de andere thread kunt doen. Als de Post faaltheb je een meory leak.
3) Ik denk dat een ref-counted string class hier het beste is. Meer details daarover nodig ?
Hier is die if niet nodig; dat klopt. Ik heb alleen een klein stukje van de functie gepost... Vandaar dat het er zo raar uit ziet :)

Het probleem heb ik nu opgelost door de string te kopieren in de thread waar het naar gepost wordt en met een handle in de andere thread te wachten totdat gebeurd is. Als dat binnen 30 sec niet gebeurd is kan ik er vanuit gaan dat het niet goed gegaan is.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op vrijdag 07 december 2001 16:06 schreef The End het volgende:
Als dat binnen 30 sec niet gebeurd is kan ik er vanuit gaan dat het niet goed gegaan is.
Eigenlijk kan dat niet en moet daar een betere oplossing voor bedacht worden.
Pagina: 1