Logik des Programmablaufes

Hallo,

ich hab mal ne grundsätzliche Frage zur Logik des Programmablaufes. Wenn im Hauptprogramm eine Prozedur startet - wird die dann in jedem Fall erst zu Ende ausgeführt, und dann mit der nächsten Anweisung im Hauptprogramm weitergemacht, oder macht das Hauptprogramm schon mal weiter und die Prozedur läuft so parallel, also gleichzeitig?
Wenn jemand nen guten link hat wo sowas gut erklärt ist, dann würde ich den gerne wissen wollen…

Danke.
Olaf

Hallo,

ich hab mal ne grundsätzliche Frage zur Logik des
Programmablaufes. Wenn im Hauptprogramm eine Prozedur startet

  • wird die dann in jedem Fall erst zu Ende ausgeführt, und
    dann mit der nächsten Anweisung im Hauptprogramm
    weitergemacht,

„Normalerweise“ ja, wobei „normalerweise“ bedeutet, daß das Programm keine zusätzlichen Threads startet (d. h. daß der einzige laufende Thread das Programm selbst ist).

oder macht das Hauptprogramm schon mal weiter
und die Prozedur läuft so parallel, also gleichzeitig?

„Normalerweise“ nicht, aber Du kannst eine zum Hauptprogramm „parallel laufende“ Prozedur realisieren, wenn Du das willst. Das mußt Du dann jedoch speziell programmieren, genauer: Du mußt einen zusätzlichen Thread definieren, erzeugen und ausführen.

Wenn jemand nen guten link hat wo sowas gut erklärt ist, dann
würde ich den gerne wissen wollen…

U. a. in Entwickler-Lehrbüchern zu Delphi findest Du entsprechende Informationen.

Mit freundlichem Gruß
Martin

„Normalerweise“ nicht, aber Du kannst eine zum
Hauptprogramm „parallel laufende“ Prozedur realisieren, wenn
Du das willst. Das mußt Du dann jedoch speziell programmieren,
genauer: Du mußt einen zusätzlichen Thread definieren,
erzeugen und ausführen.

OK, danke. Ich nehme mal an, dass ich sowas nicht mache, zumindest nicht absichtlich, weil ich gar nicht weiss, wie sowas geht.
Wenn ich aber manchmal so einzelanweisungsweise ein Programm laufen lasse (so mit F7 und F8), dann habe ich das Gefühl, dass da mehrere Prozeduren gleichzeitig ablaufen, obwohl das nicht so geplant war. Ist das dann ein Zeichen für logische Programmierfehler oder ist es beim Debuggen irgendwie anders als beim richtigen Ablauf?

Olaf

OK, danke. Ich nehme mal an, dass ich sowas nicht mache,
zumindest nicht absichtlich, weil ich gar nicht weiss, wie
sowas geht.

Threads können auch eine sehr anspruchsvolle Angelegenheit sein (je nachdem, wieviele laufen, und was sie für Aufgaben erfüllen), und ihre Technik ist Thema der fortgeschrittenen Programmierung. Was aber nicht heißt, dass nicht auch ein Einsteiger wenigstens ihren Sinn und das ihnen zugrundeliegende Konzept („nebenläufige Programmierung“) verstehen kann.

Wenn ich aber manchmal so einzelanweisungsweise ein Programm
laufen lasse (so mit F7 und F8), dann habe ich das Gefühl,
dass da mehrere Prozeduren gleichzeitig ablaufen, obwohl das
nicht so geplant war. Ist das dann ein Zeichen für logische
Programmierfehler oder ist es beim Debuggen irgendwie anders
als beim richtigen Ablauf?

Nein, ein Zeichen für logische Programmierfehler ist es sicherlich nicht. Dafür gibt es leider prinzipiell gar keine Anzeichen, außer daß das Programm in irgendwelchen Fällen oder unter irgendwelchen Voraussetzungen „nicht das tut, was es soll“. Es gibt keine „automatische“ Möglichkeit (und es wird auch nie eine geben – das kann man beweisen!), um festzustellen, ob ein Programm frei von logischen Fehlern ist (im Gegensatz zu semantischen Fehlern: damit gibt es nie ein Problem).

Zu Deinem Gefühl kann ich nicht viel sagen, außer, daß es Dich täuschen muß :wink:. Wie kommst Du darauf, daß im Einzelschritt-Betrieb im Debugger mehrere Prozeduren (gefühlsmäßig) gleichzeitig ablaufen (das ist auf keinen Fall so!)?

Martin

Zu Deinem Gefühl kann ich nicht viel sagen, außer, daß es Dich
täuschen muß :wink:. Wie kommst Du darauf, daß im
Einzelschritt-Betrieb im Debugger mehrere Prozeduren
(gefühlsmäßig) gleichzeitig ablaufen (das ist auf keinen Fall
so!)?

Na wenn ich z.B. einzelschrittweise eine bestimmte Prozedur abarbeite, komme ich ja irgendwann am letzten Schritt an, also beim „end;“. Danach müsste „der blaue Balken“ dann doch wohl auf den Befehl springen, der als nächstes nach dem Aufruf der Prozedur kommt, oder? Tut er aber nicht. Sondern er springt eben z.B. in irgendeine andere Prozedur, die noch gar nicht losgelaufen sein dürfte, solange die andere noch nicht fertig ist. So sollte es jedenfalls sein, wenn in den 15000 Codezeilen nicht irgendwelche Fehler stecken…

Olaf

Na wenn ich z.B. einzelschrittweise eine bestimmte Prozedur
abarbeite, komme ich ja irgendwann am letzten Schritt an, also
beim „end;“. Danach müsste „der blaue Balken“ dann doch wohl
auf den Befehl springen, der als nächstes nach dem Aufruf der
Prozedur kommt, oder?

Dieses Verhalten ist durchaus nicht ungewöhnlich; es kann sich zeigen, wenn z. B. folgender Fall vorliegt:

s := summe(produkt(k, j), differenz(a, b));

„summe“, „produkt“ und „differenz“ sind alles Funktionen.

Wenn Du mit im Einzelschrittmodus an diese Zeile kommst, springt der Debugger nicht in summe sondern in produkt, weil produkt „zuerst dran ist“! Hast Du die letzte Zeile in produkt erreicht, führt Dich der nächste F8-Druck in differenz rein (!), weil das als nächstes dran ist! Erst nachdem Du durch differenz durch bist, gerätst Du mit dem nächsten F8-Druck endlich in summe.

Du kannst das ja mal ausprobieren, indem Du tatsächlich solche Funktionen sowie die obige Beispielanweisung testhalber implementierst.

Liegt bei Dir vielleicht ein derartiges Konstrukt vor?

wenn in den 15000 Codezeilen nicht irgendwelche Fehler stecken…

*lach* Ein absolut fehlerfreies 15000-LOC-Programm zu schreiben halte ich für unmöglich (sehr einfache Programme natürlich immer ausgenommen).

Martin

„Normalerweise“ nicht, aber Du kannst eine zum
Hauptprogramm „parallel laufende“ Prozedur realisieren, wenn
Du das willst. Das mußt Du dann jedoch speziell programmieren,
genauer: Du mußt einen zusätzlichen Thread definieren,
erzeugen und ausführen.

OK, danke. Ich nehme mal an, dass ich sowas nicht mache,
zumindest nicht absichtlich, weil ich gar nicht weiss, wie
sowas geht.
Wenn ich aber manchmal so einzelanweisungsweise ein Programm
laufen lasse (so mit F7 und F8), dann habe ich das Gefühl,
dass da mehrere Prozeduren gleichzeitig ablaufen, …

Hallo Olaf,

da hast du völlig recht, die bisherige Erklärung ist nicht ausreichend. Unter Windows ergibt sich ein „nebenläufiger“ Programmablauf aus der Struktur von Windows (das ist im Übrigen bei jedem ereignisgesteuerten Programm so, also bei jedem modernen Userinterface).

Grundlage: Für jedes Window (das sind Knöpfe, Memofelder, usw., alles was ein Windows-Handle hat) gibt es eine endlos laufende Schleife, die auf Ereignisse wartet wie z.B. Anklicken mit der Maus, und dann ein entsprechendes Programmstück ausführt. Ansonsten sind die Windows weitgehend unabhängig.

Wenn du also mit Knopfdruck eine längere Berechnung startest, kann es durchaus sein, dass der Benutzer den Knopf nochmal drückt (besonders wenn das Interface schlecht entworfen ist und er nicht merkt, dass die Berechnung schon läuft), dann startet die Berechnung nochmal, wenn man nichts dagegen unternommen hat. Normalerweise muss man also den Knopf abschalten, bis die Berechnung fertig ist. Besonders unangenehm ist das beim Starten von Unterdialogen, man sollte das Hauptfenster abschalten, solange der Dialog aktiv ist - oder man ist sich darüber im Klaren, dass jetzt Haupt- und Unterfenster parallel laufen und programmiert dementsprechend sorgfältig. Näheres ist unter den Stichworten „Modale“ oder "Nichtmodale Dialoge zu finden.

Gruss Reinhard

Danke
Hallo,

danke an Reinhard und Martin für die Erklärungen. Wenn ich wieder mal sowas feststelle, werde ich genauer nachforschen, was die Ursache ist. Auf jeden Fall weiss ich jetzt, dass der Programmablauf nach wie vor geordnet und vor allem logisch sein sollte.

Olaf