Seite 1 von 1

Daten von COM in einem Thread einlesen und im Hauptprogramm verarbeiten

Verfasst: Di, 15. Mai 2018 15:00
von uwe.24
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

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

Verfasst: Di, 15. Mai 2018 15:32
von Wolfgang Ciriack
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) }

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

Verfasst: Di, 15. Mai 2018 16:17
von Tom
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.