Toon posts:

[Borland c++] Variabelen in een thread object

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik ben bezig met een protocol te schrijven in Borland C++ en daarvoor heb ik meerdere threads nodig die samen kunnen werken. Ik schrijf het protocol in een console applicatie project en gebruik thread objecten voor de threads. Nu werken de threads prima alleen snap ik het gebruik van variabelen binnen threads nog niet helemaal.

Allereest heb je een zogenaamde thread variabele die globaal moet zijn binnen een thread. Zowel op WIKI-web (http://en.wikipedia.org/wiki/Thread-local_storage) als in de Borland help staat dat zo'n variabele alsvolgt kan worden aangemaakt:

int __thread number;

of

__declspec(thread) int number;

Nu heb ik dit geplaatst in mijn code die er dan alsvolgt uitziet:

__fastcall mythread::mythread(bool CreateSuspended)
: TThread(CreateSuspended)
{
//.. First time the thread starts the code here is runned

int __thread x;
}

Maar ik krijg nu een foutmelding, namelijk E2188: Expression Syntax error
Wat doe ik fout? :?

Mijn tweede vraag is hoe ik netjes variabelen kan doorgeven tussen threads zonder gebruik te maken van globals. Bijvoorbeeld als de tweede thread de eerste thread suspend moet de tweede thread de pointer naar de eerste weten. Hoe vertel ik hem dit? :|

Roland

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

De threads worden toch ergens aangemaakt? Je kan bij het aanmaken dan toch een pointer meegeven? :? Ik ben momenteel met een projectje bezig waarin ik 2 threads heb lopen. Een thread schrijft naar een object, en de andere leest daar weer uit. Ze kennen dit object allebei omdat ik bij het aanmaken van die threads een pointer naar dat object heb meegegeven. Je tweede vraag lijkt me dus niet zo'n probleem?

Trouwens, op Wikipedia staat int __thread number; en jij probeert __thread int number; te gebruiken, is dat het niet gewoon?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Ja dat klopt.. staat inderdaad fout in de code maar beide werken niet. Ik had ze even allebei geprobeerd.

Hoe geef je zo'n pointer mee?

[ Voor 4% gewijzigd door Verwijderd op 21-05-2006 14:32 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Even uitgaande van dit model (exclusief tikfout :+) en mijn beschrijving van hierboven:
Afbeeldingslocatie: http://crew.tweakers.net/NMe/prg/threads.png

De controlklasse maakt eerst een buffer aan en slaat een pointer ernaar op in zijn eigen geheugenruimte. Vervolgens worden de threads aangemaakt. Klasse1 schrijft naar de buffer, Klasse2 leest eruit. Omdat beide threads de buffer gebruiken in hun execute-functie, zul een constructie als dit moeten verzinnen:
C++:
1
2
3
4
5
6
7
8
9
void Control::CreateThreads() {
  this->buffer  = new Buffer();
  this->thread1 = new Klasse1(true); // true -> start suspended
  this->thread2 = new Klasse2(true);
  this->thread1->AssignBuffer(this->buffer);
  this->thread2->AssignBuffer(this->buffer);
  this->thread1->Resume();
  this->thread2->Resume();
}

Assignbuffer is niet meer dan een (zelfgeschreven) functie die de doorgegeven pointer opslaat binnen het geheugen van de klasse zelf. Ik start de taken suspended omdat ze nog niet kunnen beginnen met runnen zolang ze geen buffer hebben. Je kan ook zoiets doen in de constructor van elke Thread-klasse:
C++:
1
this->buffer = NULL;

en dit in je Execute-functie:
C++:
1
2
3
if (this->buffer != NULL) {
  // doe wat de thread moet doen
}

Persoonlijk vind ik de eerste oplossing handiger, aangezien je thread dan niet draait op momenten dat ie niks kan doen. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zondag 21 mei 2006 @ 14:18:
Maar ik krijg nu een foutmelding, namelijk E2188: Expression Syntax error
Wat doe ik fout? :?
Je probeert een globale thread-variabele als lokale variabele te definieren. Dan heb je er toch niets aan? De constructor is gewoon een functie, en die x bestaat niet buiten de constructor. Je moet 'm dus static maken (als je 'm alleen in de constructor boeiend vind), of in de globale scope definieren. Waarschijnlijk wil je dat laatste:

C++:
1
2
3
4
5
6
7
8
9
10
11
int __thread currentThread;
int numThreads = 0;

__fastcall mythread::mythread(bool CreateSuspended)
: TThread(CreateSuspended)
{
//.. First time the thread starts the code here is runned

currentThread = numThreads; // ken een nieuw thread nummer toe
numThreads++; // en verhoog het aantal threads
}


currentThread is een globale variabele die in elke thread een andere waarde heeft, numThreads is een variabele die alle threads met elkaar sharen.

[ Voor 37% gewijzigd door .oisyn op 21-05-2006 14:56 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Okeej bedankt allemaal! :)

[ Voor 72% gewijzigd door Verwijderd op 21-05-2006 15:24 ]

Pagina: 1