[C++] BCB Threads Suspend

Pagina: 1
Acties:

  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Ik ben bezig met het maken van een programma met Threads. Ik snap nu een beetje de werking ervan, en pruts wat aan om het beter te begrijpen. Ik heb nu een programma gemaakt met 2 buttons erop en 2 apparte threads in de vorm van een statusbar:
Afbeeldingslocatie: http://home.wanadoo.nl/mhijong19/pictures/BCBThreads.jpg.
Ik probeer nu een button te maken die de actie (het vullen van de status bar) kan onderbreken. Ik heb gelezen dat dit moet kunnen met een Suspend en Resume functie. Ik heb dit als volgt gedaan:
C++:
1
2
3
4
TmyProgress *Thread2;
TmyThread *Thread;
Thread->Suspend();
Thread2->Suspend();

Als ik vervolgens het programma start, en de 2 Threads laat lopen en dan op de Suspend button druk, krijg ik de volgende error:
Afbeeldingslocatie: http://home.wanadoo.nl/mhijong19/pictures/BCBerror.jpg

Wie weet misschien waar het probleem ligt en hoe ik eventueel op een andere manier de Thread kan onderbreken. :?

Ik heb het al geprobeerd met een Status bit. Als ik dan op de button druk, dan wordt er een bit hoog gemaakt en daaraan wordt gezien of de Thread door kan gaan met het vullen van de progresbar. Dit echter werkt niet. Ik heb het idee dat ik de variabele niet goed doorgestuurt krijg. Ik heb 2 cpp files, namelijk een hoofdfile en een Thread.cpp file. In de Hoofdfile zet ik een Bit hoog en deze moet ik dan uitlezen in Thread.cpp. Dit werkt volgens mij niet... Heeft iemand daar misschien een oplossing voor?

Alvast bedankt!

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • whoami
  • Registratie: December 2000
  • Nu online
Tja, je roept een method aan van een object dat je niet geinitialiseerd hebt....

Maak die Thread objecten eens member-variablen van je form:

code:
1
2
3
4
5
6
class MyForm : TForm
{
    private:
         TThread* t1;
         TThread* t2;
}

In de OnClick van je 'start' button kan je dan die t1 en t2 gaan initialiseren en starten, in de OnClick van je suspend suspend je ze.

https://fgheysels.github.io/


  • rs-music
  • Registratie: Mei 2002
  • Laatst online: 30-08-2025
Je declareert alleen een pointer naar de thread, je zult hem ook moeten starten door bijvoorbeeld het volgende:

Thread2 = new TmyProgress(false);

  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
rs-music schreef op 14 oktober 2004 @ 09:09:
Je declareert alleen een pointer naar de thread, je zult hem ook moeten starten door bijvoorbeeld het volgende:

Thread2 = new TmyProgress(false);
Dat doe ik ook. Dit doe ik op deze manier:
C++:
1
2
3
4
TmyProgress *Thread2;
Thread2 = new TmyProgress (true);
Thread2 ->Priority = tpHighest;
Thread2 ->Resume();

De Thread zelf werkt ook wel.. dat is het prob niet. Ik krijg alleen de Thread niet in een pauze..

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Subtiel schopje... O-)

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • whoami
  • Registratie: December 2000
  • Nu online
IJnte schreef op 14 oktober 2004 @ 19:53:
[...]

Dat doe ik ook. Dit doe ik op deze manier:
C++:
1
2
3
4
TmyProgress *Thread2;
Thread2 = new TmyProgress (true);
Thread2 ->Priority = tpHighest;
Thread2 ->Resume();

De Thread zelf werkt ook wel.. dat is het prob niet. Ik krijg alleen de Thread niet in een pauze..
Je creeërt hier gewoon een nieuw thread object, dat je direct wilt resumen zonder dat het gestart is.
Dit thread object heeft geen relatie met het thread object dat je gemaakt hebt onder je start knop. Je moet één en hetzelfde thread object hebben dat je start, pauzeert, en later resumed.
Verder: zie mijn eerste bericht.

https://fgheysels.github.io/


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
whoami schreef op 15 oktober 2004 @ 11:29:
[...]


Je creeërt hier gewoon een nieuw thread object, dat je direct wilt resumen zonder dat het gestart is.
Dit thread object heeft geen relatie met het thread object dat je gemaakt hebt onder je start knop. Je moet één en hetzelfde thread object hebben dat je start, pauzeert, en later resumed.
Verder: zie mijn eerste bericht.
Ik ben er al weer een poosje mee bezig. Ik heb gedaan wat je zei, namelijk in mijn Mainform onder Private het volgende gezet:
C++:
1
2
3
private:    // User declarations
         TThread *Thread2;
         TThread *Thread;

Bij de Start onclick van mijn eerste Thread staat het volgende:
C++:
1
new TmyThread (false);

Niet erg veel dus, alleen dat ik een nieuwe Thread aanmaak. De false staat overigens voor het feit dat de thread gelijk gestart wordt als ik dit goed begrijp, want er staat namelijk het volgende bij de header van de threadfile:
C++:
1
2
__fastcall TmyThread::TmyThread(bool CreateSuspended)
        : TThread(CreateSuspended)

Hij pauzeerd de thread dus niet. Onder deze header staat Priority = tpHighest; . Ook niks bijzonders dus.
In de Execute van de thread staat dit:
C++:
1
2
3
4
5
6
7
8
9
void __fastcall TmyProgress::Execute()
{
FreeOnTerminate = true;
for(int Num = 0; Num <=5000;Num++)
 {
  Sleep(1);
  Synchronize(Progress);
 }
}

Bij Progress (de functie die de statusbar moet vullen staat alleen maar dat hij de waarde van de statusbar 1 moet verhogen.
C++:
1
Form1 ->ProgressBar2 ->Position = 0;


Ik krijg het gewoon niet voor elkaar om de thread te pauzeren. Hij blijft komen met foutmeldingen van Borland. In mijn mainform heb ik onder de button Suspend het volgende staan:
C++:
1
Thread->Suspend();

Hier krijg ik dus de foutmelding op. Zodra als ik op deze button klik gaat het fout.
Wie weet wat ik fout doe?? :X

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • whoami
  • Registratie: December 2000
  • Nu online
Ik denk dat jij nog niet met threading moet bezig zijn maar dat je eerst eens moet bezig zijn met de basics van programmeren: wat een variable is, wat een class is, etc....


Je creeërt blijkbaar een nieuwe thread zonder dat je die aan een variable toewijst.

Welke foutmeldingen krijg je van borland?

https://fgheysels.github.io/


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Afbeeldingslocatie: http://home.wanadoo.nl/mhijong19/pictures/BCBerror1.jpg
Ik zeg niet dat ik heel veel weet van programmeren, maar ik weet wel een klein beetje hoe de vork in de steel steekt. Ik kom er gewoon niet uit, omdat dit gewoon erg complex is. Ook de inet heeft veel delphi voorbeelden die al gelijk met mutexes e.d. beginen. Ik wil het gewoon even simpel houden om op die manier goed te begrijpen hoe een thread werkt.
Ik weet gewoon even niet wat ik fout doe.. ;(

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • whoami
  • Registratie: December 2000
  • Nu online
code:
1
2
3
TThread* myThread = new TThread(false);
....
myThread->Suspend();


Zoiets moet toch werken ?

https://fgheysels.github.io/


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
YESSSS ik heb et O-) . Ik zal even uitleggen wat mijn domme domme fout was :Y) :
C++:
1
2
3
4
5
6
7
8
9
10
11
oude situatie:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
new TmyThread (false);
}

Nieuw situatie:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thread = new TmyThread (false);
}


Ik snap nu ook waarom ie gaat zeuren dat de ingang ongeldig is.. Hij weet niet welke thread ie moet suspenden omdat ik niet zo slim ben geweest om aan te geven hoe die New thread heet 8) .
Met Thread->Suspend(); onder de button Suspend krijg ik de Thread in een pauze en onder de button Resume krijg ik de Thread weer verder :D .
Mijn dank ik weer zeeer groot _/-\o_ _/-\o_ whoami (en de rest)!

[ Voor 2% gewijzigd door IJnte op 21-10-2004 15:05 . Reden: bedankje ]

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • whoami
  • Registratie: December 2000
  • Nu online
Tja, dat vertelde ik je hier en hier al. :)

https://fgheysels.github.io/


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Jah ik weet et... :O ik heb er gewoon niet goed over nagedacht.. Nu ik het zie staan snap ik ook waarom je het gezegd hebt. Ik had eerst vrolijk mijn eigen ideeen geprobeerd aan de hand van de voorbeelden die je gaf, maar dat werkte maar niet..
Nog even een korte vraag >> Als ik nu 2x op de button Thread1 klik dan wordt ook gezellig 2x de thread gestart onder dezelfde naam. Als ik nu op suspend druk wanneer ik 2x op Thread 1 heb geklikt, stopt er maar 1 thread met uitvoeren. Hoe kan ik ook die 2e Thread stoppen? weet je dat zo toevallig?

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • whoami
  • Registratie: December 2000
  • Nu online
Die ene thread blijft doorlopen omdat je 2x op start klikt; die pointer naar je Thread object wijst dus op dat moment naar de 2de thread en niet meer naar de eerste.
Als je dan dus Suspend doet, wordt die 2de thread gepauzeerd; de eerste thread kan niet gepauzeerd worden omdat je geen verwijzing meer hebt naar die thread.

https://fgheysels.github.io/


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
whoami schreef op 21 oktober 2004 @ 15:46:
Die ene thread blijft doorlopen omdat je 2x op start klikt; die pointer naar je Thread object wijst dus op dat moment naar de 2de thread en niet meer naar de eerste.
Als je dan dus Suspend doet, wordt die 2de thread gepauzeerd; de eerste thread kan niet gepauzeerd worden omdat je geen verwijzing meer hebt naar die thread.
Kan je dit wel maken :?

offtopic:
24000+ berichten is best veel he O-) .

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

whoami schreef op 21 oktober 2004 @ 14:46:
Ik denk dat jij nog niet met threading moet bezig zijn maar dat je eerst eens moet bezig zijn met de basics van programmeren: wat een variable is, wat een class is, etc....
* curry684 sluit zich aan bij whoami ^^^^^

Nofi, maar je bent echt nog niet klaar voor threads zolang je nog class instances kwijtraakt doordat je je variabelen niet opslaat op een plaats met afdoende scope.
IJnte schreef op 21 oktober 2004
offtopic:
24000+ berichten is best veel he O-) .

[ Voor 22% gewijzigd door curry684 op 21-10-2004 15:50 ]

Professionele website nodig?


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
curry684 schreef op 21 oktober 2004 @ 15:48:
[...]

* curry684 sluit zich aan bij whoami ^^^^^

Nofi, maar je bent echt nog niet klaar voor threads zolang je nog class instances kwijtraakt doordat je je variabelen niet opslaat op een plaats met afdoende scope.
mm ik ben zoals ik al zei geen sterprogrammeur, maar wil het wel graag leren en begrijpen hoe iets werkt..
Ik heb een dik boek van Borland C++ builder 6 aangeschaft en daar wordt alles opzich redelijk uitgelegd alleen volgens mij veels te moeilijk gelijk. Ik ben op inet gewoon geen goede tutorials tegengekomen die mij goed vertellen hoe ik kan programmeren met threads. Er zijn sites zat die uitleggen wat een thread zijn en wat je wel en niet moet doen, maar goede voorbeelden zijn er zeer weinig.
Ik moet me dus behelpen met veel prutsen en daar gaat nog wel eens wat mis.
Als iemand mij een goede tutorial kan aanwijzen of een goed boek dan zal ik daar zeker me eens in gaan verdiepen. Dus als je wat hebt, graag...

offtopic:
Hij is nog geeneens moderator 8). Jij kan er ook wat van hoor Curry684 :Y)

[ Voor 8% gewijzigd door IJnte op 21-10-2004 16:00 . Reden: typo ]

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

IJnte schreef op 21 oktober 2004 @ 15:53:
[...]

mm ik ben zoals ik al zei geen sterprogrammeur, maar wil het wel graag leren en begrijpen hoe iets werkt..
Dat klopt, maar een timmerman-in-opleiding begint ook met een stoel voordat ie een huis gaat bouwen, if you catch my drift ;)
Ik ben op inet gewoon geen goede tutorials tegengekomen die mij goed vertellen hoe ik kan programmeren met threads. Er zijn sites zat die uitleggen wat een thread zijn en wat je wel en niet moet doen, maar goede voorbeelden zijn er zeer weinig.
Die zijn er wel, maar zoals gezegd vermoed ik simpelweg dat je het fundamentele begrip van programmeren er nog niet helemaal in hebt zitten, omdat je nog fouten maakt op het gebied van scope en variabele-opslag (oftewel memory leaks). Zolang je daar nog fouten tegen maakt ben je niet klaar voor synchronized access, mutexes en critical sections, en als je voor die 3 onderwerpen (leuke zoekwoorden voor Google overigens) niet klaar bent kun je niets met threads behalve gefrustreerd raken ;)
offtopic:
Hij is nog geeneens moderator 8). Jij kan er ook wat van hoor Curry64 :Y)
Hij was al moderator P&W voordat ik crew werd, en is recent gestopt ;)

Professionele website nodig?


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Ik ben zeker geen fulltime programmeur. Ik ben voor school bezig met een groep klasgenoten (totaal een groep van 4 met mij erbij) een programma aan het schrijven voor de SCSI bus. Ik kan je zeggen dat het flink tegenvalt qua programmeren maar wat we nu al bereikt hebben in 7 weken is heel erg veel. Een compleet programma vanaf 0 tot een programma wat al de scsi bus kan aansturen, zonder echt hulp van buitenaf. B)

Ik begrijp wel uit jullie woorden dat ik me meer moet verdiepen in basis onderdelen met variabelen/classen/pointers e.d. Ik ga dat ook zeker doen in de hoop dat ik het steeds beter ga begrijpen.
Iig bedankt voor de reacties. Btw >> nog tips / site's?

[ Voor 3% gewijzigd door IJnte op 21-10-2004 16:05 ]

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Professionele website nodig?


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
thnx. Ik ga ermee aan de slag :9

Exploring the world by bicycle! cyclingsilk.wordpress.com


Verwijderd

Lees ook de Borland documentatie van TThread. De relatie tussen TThread en de rest van de VCL is namelijk subtiel.

  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Verwijderd schreef op 21 oktober 2004 @ 17:13:
Lees ook de Borland documentatie van TThread. De relatie tussen TThread en de rest van de VCL is namelijk subtiel.
Ik heb het Boek van Borland C++ builder 6. Daar haal ik erg veel informatie uit. Ik neem aan dat je dit bedoelt.

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • whoami
  • Registratie: December 2000
  • Nu online
IJnte schreef op 21 oktober 2004 @ 17:23:
[...]


Ik heb het Boek van Borland C++ builder 6. Daar haal ik erg veel informatie uit. Ik neem aan dat je dit bedoelt.
Ik denk dat je zowiezo eerst eens wat meer basic dingen doet mbhv dat boek, en daarna eens naar threading kijkt.
Of het een goed boek is wat je gekocht heb, is moeilijk te zeggen. Er zijn zoveel boeken op de markt...
Bloog heeft het imo niet op dat boek, maar op de documentatie die bij BCB geleverd zit.

[ Voor 10% gewijzigd door whoami op 21-10-2004 17:30 ]

https://fgheysels.github.io/


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Ik ben vandaag even goed Classes bestudeerd. Ik snap nu ook goed wat ik steeds fout gedaan heb, en wat ik precies met een class kan. De site die ik gelezen heb ik cplusplus.com.
Op deze site leggen ze ook netjes uit hoe het zit met de constructor en destructor en hoe met pointers gewerkt moet worden.

Echter ik heb nog een kleine vraag. Ik had op internet ook nog een stukje gevonden over threads en daar gebruiken ze System::TObject* Sender als onderdeel van de thread
C++:
1
void __fastcall TExample::MyOnTerminate(System::TObject* Sender)


Ik begrijp als ik heb goed heb dat TObject binnen het Scope bereik valt van System. Echter bij pointers gebruiken de de asteriks (*) voor de variabele of tussen de variabele en niet direct achter de variabele zoals hier het geval is. Wie weet toevallig de functie van deze asteriks achter TObject. Ik heb het nog niet kunnen ontdekken op de site die ik bestudeerd heb.

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

System is een namespace en :: is de scope resolution operator. Je gebruikt de scope resolution operator als je binnen een namespace members van een namespace element wil aanduiden, de indirect reference operator -> als je een member op een pointer naar een instance wil benaderen, en de direct reference operator oftewel de punt op een gewone instance reference.

System::TObject* is dus gewoon een pointer naar het object TObject wat zich in de namespace System bevindt.

(italics zijn zoekwoordalert :P )

[edit]

probeer ter voorbeeld eens dit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
namespace A
{
class Piet
  {
  public:
    static void Show()
    {
    MessageBox("Huh?");
    }
  }
}

namespace B
{
class Piet
  {
  public:
    static void Show()
    {
    MessageBox("Hah!");
    }
  }
}

// Code elders
A::Piet::Show();
B::Piet::Show();

:)

[ Voor 28% gewijzigd door curry684 op 22-10-2004 15:19 ]

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Nu online
IJnte schreef op 22 oktober 2004 @ 15:05:

Ik begrijp als ik heb goed heb dat TObject binnen het Scope bereik valt van System. Echter bij pointers gebruiken de de asteriks (*) voor de variabele of tussen de variabele en niet direct achter de variabele zoals hier het geval is.
Aangezien C++ net zoals nog andere talen whitespace characters negeert is dit
code:
1
TObject* myObject;

Hetzelfde als

code:
1
TObject *myObject;

Het is gewoon een kwestie van voorkeur.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
curry684 schreef op 21 oktober 2004 @ 16:00:
[...]
Hij was al moderator P&W voordat ik crew werd, en is recent gestopt ;)
:D wat je recent noemt.
't Is ondertussen al 6 maanden geleden ofzo.

https://fgheysels.github.io/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
whoami schreef op 22 oktober 2004 @ 15:34:
[...]

Aangezien C++ net zoals nog andere talen whitespace characters negeert is dit
code:
1
TObject* myObject;

Hetzelfde als

code:
1
TObject *myObject;

Het is gewoon een kwestie van voorkeur.
Nou ja, negeert - dit is een leuke bug:
C++:
1
2
3
4
switch(x) {
  case1:
    foo();
}

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


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

whoami schreef op 22 oktober 2004 @ 16:25:
[...]


:D wat je recent noemt.
't Is ondertussen al 6 maanden geleden ofzo.
Vrijwel exact zelfs: * whoami gooit bijltje ;)
MSalters schreef op 22 oktober 2004 @ 17:30:
[...]

Nou ja, negeert - dit is een leuke bug:
C++:
1
2
3
4
switch(x) {
  case1:
    foo();
}
Tis wat je leuk vindt, die zou ik m'n collega's eigenlijk niet zomaar aan doen :)

Professionele website nodig?


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
curry684 schreef op 22 oktober 2004 @ 15:15:
System is een namespace en :: is de scope resolution operator. Je gebruikt de scope resolution operator als je binnen een namespace members van een namespace element wil aanduiden, de indirect reference operator -> als je een member op een pointer naar een instance wil benaderen, en de direct reference operator oftewel de punt op een gewone instance reference.

System::TObject* is dus gewoon een pointer naar het object TObject wat zich in de namespace System bevindt.

(italics zijn zoekwoordalert :P )

[edit]

probeer ter voorbeeld eens dit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
namespace A
{
class Piet
  {
  public:
    static void Show()
    {
    MessageBox("Huh?");
    }
  }
}

namespace B
{
class Piet
  {
  public:
    static void Show()
    {
    MessageBox("Hah!");
    }
  }
}

// Code elders
A::Piet::Show();
B::Piet::Show();

:)
Lol ik dacht al dat het een speciale functie was ofzo. Ik heb idd ook het verhaal van namespaces al goed doorgelezen (zoals de standaard std namespace) en daar kwam dit ook naar voren. Dit is een heel erg duidelijk voorbeeld. Ik ga even opzoek wat die system namespace precies doet iig!
Ik begrijp dus dat ik ook mag zeggen System::Tobject *Sender. Thnx ,ik heb vandaag erg veel bijgeleerd. Jullie advies was niet verkeerd al zeg ik het zelf. Ik merk ook dat ik te vlug begonnen ben met threads want als ik het stuk over classes en pointer goed had doorgelezen dan had ik denk ik de vraag niet hoeven stellen O-) .

Erg bedankt voor de hulp _/-\o_

Exploring the world by bicycle! cyclingsilk.wordpress.com

Pagina: 1