Autor Beitrag
Weide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Sa 20.07.02 11:03 
Hallo,

ich benutze eine Komponente, mit der ich Daten über die serielle Schnittstelle senden kann. Leider muß ich mit der Übertragung des nächsten Datensatzes warten, bis das Senden des vorherigen beendet ist. Dies geschieht, indem ich eine Eigenschaft (SendInProgress true/false) abfrage.

Nehme ich dazu irgendwelche Schleifen (while, repeat oder goto), um ständig die Eigenschaft abzufragen, so bleibt das Programm dort hängen. Offensichtlich werden in einer Schleife irgendwelche anderen Komponenten nicht mehr abgefragt. Wie kann ich das umgehen?



vielen Dank im Voraus

Gruß Weide
Marc
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 169

Win 2000, Win XP, SuSE Linux 8.2

BeitragVerfasst: Sa 20.07.02 12:38 
Hi Weide,

schreib' uns doch mal den Code. Ich denke, dann können Dir unsere User schneller und besser helfen.

Gruß Marc
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Sa 20.07.02 13:46 
Weide hat folgendes geschrieben:
so bleibt das Programm dort hängen
Wahrscheinlich empfängt das Programm keine Nachrichten mehr. Versuch mal in der While oder Repeat-Schleife die Anweisung
ausblenden Quelltext
1:
Application.ProcessMessages;					

einzubauen. Das sollte eventl schon helfen!

Gruß
TINO
Visum
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Sa 20.07.02 13:48 
Hi,
hab davon eigentlich nicht so die Ahnung.
Spontan würde ich folgendes machen:

ausblenden Quelltext
1:
2:
3:
4:
5:
//Datensatz senden
repeat
sleep(10)
until SendInProgress=false;
//nächsten Datensatz senden


Allerdings kann ich das nicht testen, da ich nicht weiß, wie man Datensätze verschickt ;). Ausserdem weiß ich nicht, ob das sleep() das Senden des ersten Datensatzes beeinflusst.

Hoffe trotzdem wenigstens ein bisschen geholfen zu haben
Visum
Weide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Sa 20.07.02 16:40 
Hallo,

vielen Dank erstmal für Eure Antworten. Mit "sleep" klappt es leider nicht - hier wird gleichfalls die Datenübertragung gekappt. Mit "application.ProcessMessages" klappt's leider auch nicht, auch nicht mit irgendwelchen Abarten davon (z.B. application.HandleMessage). Immerhin brauch ich mit diesen Methoden das Programm nicht mit der Taskleiste abschiessen - es reagiert immerhin schon auf "ctrl-F2". Leider wird "SendInProgress nach wie vor nicht upgedatet. Vieleicht habt ihr ja noch irgendwelche Ideen.

Ich kann natürlich nach dem Senden einen Moment warten, indem ich einen Timer starte und beim Timer Event den nächsten Datensatz losschicke, aber dazu benötige ich für jeden Datensatz einen Timer - das finde ich sehr unelegant und unübersichtlich. Und wie gesagt - "sleep" funtioniert leider nicht :-(

Gruß Weide
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Sa 20.07.02 22:53 
Kannst Du mal den Code der Repeat- oder While-Schleife schicken. Ich kann mir nicht vorstellen das das nicht klappen sollte!

Gruß
TINO
Weide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Sa 20.07.02 23:21 
Hallo Tino,

anbei mal der Code:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Senden(Sender:TObject);
var Escape: String;
begin
  Escape := #$1b+'[2J'+#$0d;           //Display löschen
  SerialPortNG1.SendString(Escape);

  while SerialPortNG1.SendInProgress = true do
  Application.ProcessMessages;


   SendStr := SendStr+#$0d;
   SerialPortNG1.SendString(SendStr);
end;



Ich sende zunächst eine Escape-Sequenz und anschließend den Datensatz(SendStr). Es müssen allerdings mehrere Escapesequenzen gesendet werden, deshalb suche ich nach einer eleganten/übersichtlichen Variante.


Eine andere Variante funktioniert ebenfalls nicht:

ausblenden Quelltext
1:
2:
3:
4:
  repeat
  SendeEnde := SerialPortNG1.SendInProgress;
  Application.ProcessMessages;
  until SendeEnde = false;


Gruß Weide
Bart Simpson
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 24.07.02 12:04 
Ich weiss nicht, was für ein Gerät Du da ansprechen willst, aber warum ist es denn eigentlich nicht möglich die Befehle direkt hintereinander abzusenden (evtl. mit "Trennnullen")? Checkt das Teil sowas nicht, oder was? Also ich tu grad was ähnliches mit 'nem Messgerät am Com-Port, und ich hab damit keine Probleme.

Bart Simpson

_________________
NAESSER'S GESETZ: Man kann etwas narrensicher machen, aber nicht _verdammt_ narrensicher!
Weide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Mi 24.07.02 12:46 
Hallo Bart,

leider geht es so nicht. Ich muß, bevor ich die eigentlichen Nutzdaten schicke, noch ein paar Escapesequenzen senden, um das Gerät (es ist ein Barcode-Funkscanner) zu initialisieren. Leider nimmt er mehrere Escapesequenzen in einem "Durchlauf" nicht an.

Gruß Weide