Daten von COM in einem Thread einlesen und im Hauptprogramm verarbeiten

Moderator: Moderatoren

Antworten
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück
Danksagung erhalten: 1 Mal

Daten von COM in einem Thread einlesen und im Hauptprogramm verarbeiten

Beitrag 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
Uwe aus OS
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

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

Beitrag 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) }
Viele Grüße
Wolfgang
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

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

Beitrag 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.
Herzlich,
Tom
Antworten