Variablen in Threads

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Variablen in Threads

Beitrag von Joel »

Hi,

Naja um Variablen gehts nicht wirklich. Eigentlich bin ich momentan meine Programme am Optimieren. Und Projekte am vergrößern. Naja und da habe ich immer wieder Bugs, die mehr oder weniger die gleiche Ursache haben, woltle ich versuchen, die mal in den Griff zu bekommen. Meine Frage ist sozusagen eine Frage, wie ich mein Programmierverhalten verbessern kann. Am besten stell ich euch einfach mal mein Problem vor.

Als Beispiel, es gibt 2 Threads, die beide miteinander Kommunizieren. Der 1. Thread zeigt die Werte im Fenster an und der 2. Rechnet sie aus.

In Thread 2 werden jede Menge Variablen miteinander Addiert und Geteilt und wieder neu definiert etc. bis irgendwann ein Wert herauskommt. Die Beispiele einfach etwas größer Vorstellen, so wie sie in einem 10000 Zeilen Projekt aussehen würden...

Beispiel:

Code: Alles auswählen

global r 
....
..
....

Procedure Thread2()
Blockgröße = menge.l/Mb*Anzahl.l
Repeat
x+x
Blockgröße+Blockgröße
x = Getgadgettext(...)
r = x*Menge/rts
....
.....
.......
Blockgröße+x
If Ende = 5
end 
endif 
Forever 
endprocedure 

Code: Alles auswählen

Procedure Thread1()
setgagdgetstate(#www, r)
...
...
Ende = 5
endprocedure 
Das Problem ist nun. Wenn ich jetzt das Programm beende bzw. beide Thread beendet werden (siehe Ende = 5) und dann später die Threads wieder aufgerufen werden hat x,r, Blockgröße und noch Hunderte andere Variablen einen Wert. Außerdem hat Beenden den wert 5 und die Prozedur wird sofort beendet.

Ok, dafür gibt es zwar eine Möglichkeit, aber die ist glaube ich nicht optimal.

Code: Alles auswählen

Procedure Aufräumer()
r = 0
menge = 0
Blockgröße = 0
x = 0
trs.s = ""
p.l = 0
.....
...
...
endprocedure
Naja, das Problem ist nur, das ich erstens mal, sehr viele aufräumer Proceduren habe und dass ich dann z.B. vergesse einen Wert auf 0 zu stellen. Oder zu viel aufräume (also z.B. was Nulle, das ein Fenster noch braucht etc.

Optimal wäre jetzt so ein Schlüsselwort wie Define, das eine Variable Global macht , aber sich von selbst auf Null bzw "" setzt, wenn der Thread, in dem das Ding Definiert wurde beendet wird.

Sowas gibts aber glaube ich nicht.

Ich hoffe, ihr habt mein Problem verstanden und habt eine Idee.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Variablen in Threads

Beitrag von Kaeru Gaman »

wie wärs denn mit

Code: Alles auswählen

If Ende = 5
  Ende = 0
  End
Endif 
und wenn du statt ForEver dort Until Ende = 5 nimmst, kannst du danach bequem zurücksetzen was du lustig bist.
außerdem beendest du dann den Thread mit EndProcedure und nicht mit End, wär mir eh sympatischer.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Burstnibbler
Beiträge: 58
Registriert: 04.10.2008 12:10

Re: Variablen in Threads

Beitrag von Burstnibbler »

Joel hat geschrieben:Wenn ich jetzt das Programm beende bzw. beide Thread beendet werden (siehe Ende = 5) und dann später die Threads wieder aufgerufen werden hat x,r, Blockgröße und noch Hunderte andere Variablen einen Wert.
Ok, dafür gibt es zwar eine Möglichkeit, aber die ist glaube ich nicht optimal.
Hallo Joel,

Du könntest ja deine Hunderte von Variablen sinnvoll auf Strukturen verteilen und diese dann bei Bedarf mit ClearStructure() [PB 4.40 ! ] in einem Rutsch auf Null setzen.

Code: Alles auswählen

Structure Test
 a.b
 b.w
 c.l
 d.q
 t.s
EndStructure

Define a.test

a\a=11
a\b=2009
a\c=753491
a\d=12345677890
a\t="Hallo Welt"

Debug a\a
Debug a\b
Debug a\c
Debug a\d
Debug a\t

ClearStructure(@a,Test)

Debug "---"
Debug a\a
Debug a\b
Debug a\c
Debug a\d
Debug a\t

MfG
Burstnibbler
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Variablen in Threads

Beitrag von Joel »

Ja, gute Idee!!!

So mach ich das thx... :mrgreen:
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Re: Variablen in Threads

Beitrag von walker »

... das ändert nichts an Deinem eigentlichen Problem...
Ich vermute mal, das du zu viele Variablen als Global deklarierst ... daher haben "hunderte Variablen" nach einem erneuten Aufruf Deiner Prozedur/Thread immer noch einen Wert!

Folgendes solltest Du in Deiner Vorgehensweise ändern:

1. EnableExplicit verwenden (hat mit dem Problem nix zu tun... ist aber empfehlenswert)
2. Variable, die du in einer Prozedur verwendest, nur dort deklarieren ... unter Umständen Shared verwenden
3. Global nur, wenn es sich nicht vermeiden lässt ....
4. Erweitere deine Prozedur-Parameter, um benötigte Werte mit an diese zu übergeben anstatt den Wert Global zu deklarieren...

Das macht die Sache weniger fehleranfällig und einen Fehler bezüglich Variablenbelegung lässt sich recht schnell finden
Nebeneffekt: Prozeduren lassen sich so auch leichter in andere Projekte einbinden (Wiederverwendbarkeit)
(und so was wie Dein aufräumer ist überflüssig...)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Variablen in Threads

Beitrag von Kaeru Gaman »

@walker

Variablen, die zur Kommunikation zwischen Threads verwendet werden, müssen Global sein.

Shared bewirkt keinen Unterschied, das kommt in diesem Fall aufs selbe heraus wie Global.

... also insofern ist dies sein eigentliches Problem, und es müßte es wie oben vorgeschlagen lösen.
auf Global zu verzichten wäre keine Option.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Variablen in Threads

Beitrag von ts-soft »

> auf Global zu verzichten wäre keine Option.
Naja, wenn mehrere Threads auf eine globale Variable (auf denselben Speicher schreiben) zugreifen krachts :mrgreen:
Globale Variablen sind also zu vermeiden und wenn schon, dann müssen sie gelockt (Mutex) werden.

Allerdings der angedeutete 10000 Zeilencode macht nur unzureichende Andeutungen. Sehe nur ein
globales R und lauter undefinierte, deshalb halte ich eine Hilfe sowieso nicht für möglich und Hellsehen
ist kurz vor Weihnachten nicht mein Ding :bounce:

Gruß
Thomas
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Variablen in Threads

Beitrag von Kaeru Gaman »

so wie ich sein erstes Posting interpretiere, greift der zweite thread nur lesend zu.

aber du hast recht, nichts definitives weiß man nicht.

es ist durchaus möglich, dass man das ganze Problem total anders und viel eleganter lösen kann.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten