Daten von COM in einem Thread einlesen und im Hauptprogramm verarbeiten

Moderator: Moderatoren

Antworten
Benutzeravatar
uwe.24
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 33
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück

Daten von COM in einem Thread einlesen und im Hauptprogramm verarbeiten

Beitrag von uwe.24 » Di, 15. Mai 2018 15:00

Hallo.

Ich bin dabei mit eXpress++ eine Datenerfassung für ein Prüfgerät über eine serielle Schnittstelle zu basteln.

Folgendes hab ich:
In einem Thread lesen ich erfolgreich die angekommenen Daten von COM2 ein.
Die sind dann in 4 Variablen (nEl, nEl1, nEl2, nEl3) abgelegt.

In dem Hauptprogramm hab ich die Maske für die anderen Daten dazu und auch 4 Gets nEl, nEl1, nEl2 und nEl3. Die will ich eigentlich nach erfolgreichem Einlesen füllen.
Es gelingt mir aber nicht, die Maske im Hauptprogrammteil aus dem Thread1 heraus zu aktualisieren.
Erst wenn ich im Hauptprogamm etwas mache (einen Button drücke) und ein dc_getrefresh(getlist) absetze, klappt es.

Wie geht das denn direkt aus dem Programmteil des einlesenden Threads?
Ein dc_getrefresh(getlist) dort geht nicht.

Code: Alles auswählen

PROC DataLesen

   if lCOMSchonOffen := .t.
      cInputVonCom := ""
      cIn = ""
      cComAnzeige := "Warte auf Daten vom RB3000"

      do while .t.
         if com_count(2) > 0
            cIn = com_read(2,1)
            cInputVonCom = cInputVonCom + cIn
            if cIn = chr(13)
               cCOMAnzeige = "Habe Daten empfangen vom COM: " + cInputVonCOM
               trennen(cInputVonCom)
               cInputVonCom := ""
               lDataMode := .t.
               DC_GetRefresh(GetList)
            endif
         endif
      enddo
   endif
RETURN

Uwe aus OS
Uwe aus OS

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2375
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Re: Daten von COM in einem Thread einlesen und im Hauptprogramm verarbeiten

Beitrag von Wolfgang Ciriack » Di, 15. Mai 2018 15:32

Ich denke, du solltest aus deinem Thread einen userdefined Event an deinen Dialog schicken, der dann das DC_Getrefresh(Getlist) auslöst.

In ch-Datei: #define USEREVENT_REFRESH xbeP_User+111 (o.ä.)
Im Thread: PostAppEvent(USEREVENT_REFRESH,,,oHauptdialog)
oHaupdialog muss im Thread natürlich bekannt sein (als Parameter mitgeben oder public definieren)
Im Dialog: DCUSEREVENT USEREVENT_REFRESH ACTION {|| dc_getrefresh(Getlist) }
Viele Grüße
Wolfgang

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7090
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Daten von COM in einem Thread einlesen und im Hauptprogramm verarbeiten

Beitrag von Tom » Di, 15. Mai 2018 16:17

Oder über SetTimerEvent() - die Einlesefunktion setzt eine Flag-Variable oder eine Get-Set-Funktion, auf die SetTimerEvent reagiert, um dann das DC_GetRefresh auszulösen (und Variable/Funktion wieder zu resetten).

Man kann Aktualisieren-Buttons übrigens dadurch automatisch feuern lassen, dass man ihre Action auslöst: "oButton:Action()". Das ginge dann auch im SetTimerEvent-Thread, wenn dieser den Button kennt.
Herzlich,
Tom

Antworten