Autor Beitrag
ehorn
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 09.03.07 18:55 
Hallo zusammen,

ich knabbere an einem Problem, an dem ich verrückt werde. Ich habe für unsere Schule ein Programm in Delphi 7 zur Vergabe von Facharbeiten in der Jgst. 12 geschrieben. Die Schüler können für die Facharbeit vier Fächer wählen und nach einem entsprechenden Algorithmus und vorgegebenen Bedingungen (nicht mehr als vier Arbeiten pro Kurs, nicht mehr als sechs Arbeiten pro Lehrer, falls ein Lehrer mehrere Kurse hat) werden von dem Programm die Facharbeiten zugelost. Dabei wird für jeden Los-Durchgang in Abhängigkeit der Verteilung der erfüllten Erst- bis Viertwünsche ein Score-Wert gebildet; sobald ein Score-Wert besser ist als der bisher beste, wird die aktuelle Zulosung gespeichert.

Die Zulosung soll bei uns öffentlich geschehen, weshalb es eigentlich so gedacht war, dass das Programm einen Button "Abbruch" hat, der den Algorithmus unterbrechen soll und die bis dahin beste Verteilung ausgibt, sodass eine Schuelerin oder ein Schueler nach x Minuten einfach "Stop" sagen kann. Gedacht hatte ich mir das so, dass durch Betätigen des Abbruch-Buttons eine globale Boolean-Variable auf "True" gesetzt wird, die vorher auf "False" initialisiert war. Die verschiedenen Durchgänge für das Losverfahren habe ich dann in einer REPEAT-UNTIL-Schleife untergebracht, deren Abbruchbedingung eigentlich sein sollte, dass die Abbruch-Variable auf "True" steht. Nun aber das Problem: Starte ich mit einem Start-Button den Ablauf des Programms, kann ich während des Ablaufs des Algorithmus gar nicht auf den Abbruch-Button klicken, sodass es auch gar nicht zum Abbruch des Algorithmus kommt. Da das Problem ja als Optimierungsvorgang ein nicht-endliches Problem ist, läuft ja eigentlich auch der Algorithmus unendlich.

Dementsprechend meine Frage: Wie kann ich Delphi dazu bekommen, dass es auch während der Abarbeitung der Befehle der Start-Button-Click-Prozedur das Betätigen eines anderen Buttons (Abbruch-Button bzw. Abarbeitung deren Click-Prozedur) zulässt. Ich hatte eigentlich gedacht, dass das unter den Begriff der Nebenläufigkeit fällt, aber über diesen Suchbegriff bin ich nicht wirklich fündig geworden. Gibt es da in Delphi keine Möglichkeit, sowas zu realisieren?

Danke im Voraus

Eric.
starsurfer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 334

Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
BeitragVerfasst: Fr 09.03.07 18:59 
Du kannst das gut mit Threads bewerkstelligen.

Oder einfacher:

du rufst in deinen Schleifen

ausblenden Delphi-Quelltext
1:
application.ProcessMessages;					


auf, damit kann dein Programm auf Ereignisse wieder reagieren.

_________________
GEIZ IST GEIL! - Ihr Sozialamt


Zuletzt bearbeitet von starsurfer am Fr 09.03.07 19:02, insgesamt 1-mal bearbeitet
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Fr 09.03.07 19:00 
Die Lösung schimpft sich Suche in: Delphi-Forum, Delphi-Library APPLICATION.PROCESSMESSAGES. :wink:

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 09.03.07 19:04 
user profile iconjakobwenzel hat folgendes geschrieben:
Die Lösung schimpft sich Suche in: Delphi-Forum, Delphi-Library APPLICATION.PROCESSMESSAGES. :wink:


dem ist nur noch ein Beispiel hinzuzufügen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//globale Variable:
var Exit: Boolean;

//Algorithmus:
While not Exit do
begin
  //irgendwas
  Application.ProcessMessage;
end;

//OnButton_ExitClick (Caption = 'Abbrechen')
Exit := True;
ehorn Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 09.03.07 21:36 
Hallo,

lieben Dank für die schnelle Hilfe. Mit Application.ProcessMessages klappt das hervorragend, das ist genau das, was ich brauchte. Ihr seid spitze!

Gruss und Dank

Eric.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 09.03.07 22:02 
Noch eine kleine Ergänzung dazu ;).

Der Befehl ist mit Vorsicht zu genießen. Er erfüllt zwar seinen Zweck, so wie er soll, aber er bedeutet doch einen erheblichen Performanceverlust, wenn er zu oft aufgerufen wird. Viel schöner ist da das Arbeiten mit Threads, was auch nicht all zu schwer ist, so lange der Algorithmus auch ohne direkten Zugriff auf die GUI auskommt (da Zugriffe auf die GUI auch hier Performanceverluste bedeuten, wegen Synchronisationen). Für dein Programm scheint allerdings der BEfehl zu reichen, auch wenn ich an deinem Problem nicht ganz verstanden habe, wie der Algo vorgeht, also ob man wirklich eine Endlosschleife braucht ;).