Blockieren sich Subs gegenseitig? VB6

Hallo liebe Gemeinschaft,
diesmal ist es weniger ein Problem sondern eine Frage.

Ich habe eine sehr große Sub, die sehr lange zur Fertigstellung braucht und welche eigene Variablen besitzt.

Meine Frage ist ob es möglich ist diese Sub mehrmals parallel (also gleichzeitig) laufen zu lassen, oder ob Sie sich gegenseitig mit den Variablen in die Quere kommen.

Danke im Vorraus!
MfG Markus

Hallo,

Ich habe eine sehr große Sub, die sehr lange zur
Fertigstellung braucht und welche eigene Variablen besitzt.

Meine Frage ist ob es möglich ist diese Sub mehrmals parallel
(also gleichzeitig) laufen zu lassen,

nein, VB6 hat nur einen einzigen Programmzeiger. Es kann immer nur ein Befehl ausgeführt werden. Auch wenn du die Prozedur mehrfach startest, bevor sie beendet ist, werden die nicht gleichzeitig abgearbeitet. Du kannst mit Einfügen von DoEvents dafür sorgen, daß die verschiedenen Aufrufe scheinbar etwa gleichzeitig ablaufen, es wird aber trotzdem immer nur ein Befehl ausgeführt. Schneller wird davon nichts.

oder ob Sie sich gegenseitig mit den Variablen in die Quere kommen.

Ja. Das ist der zweite Nachteil. Die Variablen nehmen chaotische Werte an, die verschiedenen Aufrufe beeinflussen sich gegenseitig.

Gruß Rainer

Hallo Rainer :smile:

Hallo,

Ich habe eine sehr große Sub, die sehr lange zur
Fertigstellung braucht und welche eigene Variablen besitzt.

Meine Frage ist ob es möglich ist diese Sub mehrmals parallel
(also gleichzeitig) laufen zu lassen,

nein, VB6 hat nur einen einzigen Programmzeiger. Es kann immer
nur ein Befehl ausgeführt werden. Auch wenn du die Prozedur
mehrfach startest, bevor sie beendet ist, werden die nicht
gleichzeitig abgearbeitet.

Hier lege ich mal ein Veto ein :wink: Der Fragesteller kann sich beliebig viele Threads anlegen, diese starten und voila hat er das gewünschte :smile:

Aber was ich mich gerade frage. Wie soll es gehen das meine eine Prozedur in selben Thread mehrmals zur gleichen Zeit startet? *grübel*

Du kannst mit Einfügen von DoEvents
dafür sorgen, daß die verschiedenen Aufrufe scheinbar etwa
gleichzeitig ablaufen, es wird aber trotzdem immer nur ein
Befehl ausgeführt. Schneller wird davon nichts.

Mit Threads schon :smile:

oder ob Sie sich gegenseitig mit den Variablen in die Quere kommen.

Ja. Das ist der zweite Nachteil. Die Variablen nehmen
chaotische Werte an, die verschiedenen Aufrufe beeinflussen
sich gegenseitig.

Nicht wenn sie in verschiedenen Threads laufen :smile:

Gruß Rainer

MfG Alex

1 Like

Guten Tag,

VB6 hat die möglichkeit von Threads?
Ich habe mal danach gesucht, aber nichts gefunden.

Hallo,

ja das hat sie :smile: Ich müsste auch mal schauen wie es ging, aber bei Bedarf kann ich Dir einen Source posten :smile:

MfG Alex

Wirklich?

Ich kann mich nur an einen Source erinnern, welcher VB6 abgeschossen hat als man den Thread startete

Hallo Magifix,

Wirklich?

Ich kann mich nur an einen Source erinnern, welcher VB6
abgeschossen hat als man den Thread startete

Ich bin nun endlich mal dazu gekommen nachzuschauen wie ich es damals gelöst habe. Sicher sind Threads in VB bis zur Version 6 eine heikle Sache, die schon öfters mal VB abstürzen lies, wenn man es falsch gehandhabt hat!

Ich habe es mit folgenden API’s gelöst

einen Thread erzeugen tust du mit der API CreateThread
einen Thread einschläfern tust du mit der APi SuspendThread
Einen thread aufwecken tust du mit der API ResumeThread
Die ThreadPrioritaet tust du mit der API SetThreadPriority festlegen.
Den aktuellen Thread tust du mit der API ExitThread beenden
einen thread von aussen beenden tust du mit der API TerminateThread

Hierbei musst du aber bedenken, das du beim beenden des Proggis auch den Thread beenden tust, sondern schmiert die Deine Anwendung ab. Gerade wenn du Dein Proggi im Step by Step Modus laufen laessen laesst, führt dies zu Problemen. Aber schreibe halt deine Routine und erst wenn du weisst das sie genau das macht was sie soll und du dein Proggi fertig hast, dann packe sie in den Thread und startet ihn dann. So kannst du es gleich danach kompilieren und voila läuft. Sollte dies nicht gehen, so achte peinlich genau darauf das du den Thread beendest, denn sonst schmiert wie gesagt dein VB ab :smile: ( Also Project öfters speichern )

Brauchst du den Source, so sage einfach bescheid, dann kopiere ich ihn aus meinem Project von damals raus :smile:

PS: Schon einmal überlegt nach .NET umzusteigen? Da sind Threads nun wirklich kein Problem mehr :wink:

MfG Alex

Hallo

Ja, mit API-Calls gehts. Bis zu 1000 Threads z.B…
Und wenn die Variablen als privat fürs sub gekennzeichnet sind, bleiben sie das auch. Bei globalen Variablen kommen die Threads natürlich in Konflikt. Man kann aber die globalen Variablen(bzw. Datenobjekte) benutzen, um Threads miteinander kommunizieren zu lassen.

Ich hab das VB5 und ich würde das Threading derselben Sub nur empfehlen, wenn mehrere Prozessoren da sind.
Denn sonst klaut ja ein Sub dem anderen die CPU-Zeit.
Ausprobieren kann man Multithreading aber auch mit einer 1 Kernel CPU.

Und genau, abstürzen wird es zuerst immer wieder, bis man weiß, wie es geht, bzw. wo man es richtig abtippen kann.

Außerdem würd ich sagen, das, wenn es lange dauert, bis ein Sub durch ist, ist da irgendwo ein Fehler. Man könnte auch „Optimierungsbedarf“ sagen. Mehrere Threads von derselben „Sch.“ bringens nicht.

MfG
Matthias

Hallo Alex,
ja ich hab Visual Studio 2005 mit .NET auch compact Framework, aber so richtig gut find ich das nicht. Weil ich keine Art Winsock fürs CF.NET finde.
Ich wäre dir sehr dankbar könntest du mal ein Codebeispiel kopieren!

Danke im Vorraus

Hallo Alex,

zitat aus API-Guide:

'Using the CreateThread function in Visual Basic
'is very risky! VB5 is ‚kinda‘ stable, but VB6
'applications will probably crash when you
'use the CreateThread function.

Es ging um VB6.

Gruß Rainer