Forum: PC-Programmierung Welches Tool um einfaches Programm zu erstellen?


von _Gast (Gast)


Angehängte Dateien:

Lesenswert?

Vorwort: Ich bräuchte ein Programm auf Windows, um bei der Änderung 
einer Datei, diese über UART zu senden.

Design (siehe Anhang):

- Auswahl COM Port und Baudrate
- "..." Auswahl der zu überwachenden Datei
- Darstellung des Nachrichtenverlaufes (< vor ausgehenden und > vor 
eingehenden Nachrichten), halbduplex ist ausreichend
- Fenster mit letzter eingehenden Nachricht welche einen bestimmten Code 
davor hatte.


Funktion:

Auswahl COM Port und Baudrate: Es soll möglich sein, den gewünschten COM 
Port und die für die Übermittlung verwendete Baudrate aus zu wählen. 
Sobald ein COM Port und die Baudrate ausgewählt worden ist, soll eine 
entsprechende Nachricht per UART gesendet werden.

Auswahl Datei: Über den Button [...] soll eine Datei ausgewählt werden 
unabhängig ihrer Endung (theoretisch nicht größer 1MB). Sonald diese 
Datei ausgewählt worden ist, soll diese per UART gesendet werden. 
Anschließend soll diese Datei überwacht werden und immer wenn sich der 
Inhalt ändert soll diese neu gesendet werden. Es sollen sowohl Druckbare 
wie auch nicht Druckbare Zeichen gesendet werden, sodass die Datei beim 
Empfänger wieder zusammen gesetzt werden kann.

COM Kommunikation: In diesem Feld sollen die gesendeten und empfangen 
Daten ohne Filter dargestellt werden. Gesendete Daten sollen ein "<" und 
empfangene Daten ein ">" davorgestellt bekommen.

Letzte Nachricht mit bestimmter Syntax: Wenn eine Nachricht mit einer 
bestimmten Zeichenfolge davor empfangen wird, soll diese bis zur 
nächsten Nachricht mit entsprechender Zeichenfolge hier angezeigt 
werden.


Bonus:

Fehlersicherheit: Die Daten werden in Blöcken von z.B. 128Byte versendet 
wonach beispielsweise ein Paritätsbyte kommt.

Bei Antwort vom Empfänger "Richtig" werden die nächsten 128Byte 
gesendet.
Bei Antwort vom Empfänger "Falsch" werden die letzten 128Byte erneut 
gesendet.
Bei mehrfacher Antwort vom Empfännger "Falsch" wird die übertragung nach 
dem 3. Versuch abgebrochen und eine Zeichenfolge für den Abbruch 
gesendet.
Bei keinie Antwort vom Empfänger wird die Übertragung nach 3. Sekunden 
abgebrochen und eine Zeichenfolge für den Abbruch gesendet.

Unterstützung von Commandos ähnlich Putty für Textfarbe durch empfangene 
Daten.




Frage:

Welches Programm würdet ihr mir empfelen für dieses Ziel, könnt ihr mich 
dabei unterstützen, hat jemand sowas schon mal gemacht, möchte das vllt 
sogar jemand für mich machen?

Sollten weitere Fragen sein, oder etwas von mir nicht richtig durchdacht 
bin ich natürlich daran interessiert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

_Gast schrieb:
> Welches Programm würdet ihr mir empfelen für dieses Ziel,

Das, das Du schon hast (oder kennst) und mit dem Du bereits umgehen 
kannst.

Wenn Du so eines nicht hast, dann eines, wo ein persönlicher Bekannter 
von Dir mit umgehen kann, damit er Dir bei Deinen möglichen Problemen 
damit helfen kann.

Wenn Du keinen Bekannten hast, dann eines, das mit einer 
Programmiersprache arbeitet, mit der Du schon selbst zu tun hattest.

Oder mit einer, bei der abzusehen ist, daß Du der in Deiner Schule bzw. 
sonstwie in der nächsten Zeit begegnen wirst.

von Hmm (Gast)


Lesenswert?

Hui, vor einem ganz ähnlichen Problem stehe ich auch gerade - serielle 
Kommunikation mit µC und GUI in Windows.

Ich habe meine derartigen Programme bisher als C-Programm mit 
Kommandozeile geschrieben (in Code::Blocks). Das geht ganz passabel, 
aber naja, Kommandozeile...

So, wie ich das sehe, gibt es folgendes:
QT (in C++), aber da muss man sich offensichtlich registieren.

Mit wxWidgets und C++ in Code::Blocks: Dazu bin ich zu blöd. Bei mir 
kompiliert nicht einmal die Lib durch, was man ja erst einmal tun muss. 
Die Precompiled Packages funktionieren auch nicht.

Python : Da ist für mich völlig undurchsichtig, welche IDE/Editor und 
welches Framework da Sinn macht.

Java : Keinen Plan.

Visual Studio:  Fällt bei mir weg, weil 1. Microsoft, 2. Linux soll auch 
gehen

Nach 4 Stunden herumprobieren, ist mir heute die Lust dazu erst einmal 
gründlich vergangen.
Erkenntnisse bis jetzt: Ohne eine neue Programmiersprache (ich kann nur 
C halbwegs ordentlich) wird das nichts.

So einfach scheint das nicht zu sein :-(

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Hmm schrieb:
> QT (in C++), aber da muss man sich offensichtlich registieren.
https://www.qt.io/download-qt-for-application-development
Einfach die Open Source Variante waehlen. Das sollte ohne Registrierung 
laufen. Ich weiss aber nicht, wie das unter Windows aussieht, bin nur 
auf Linux unterwegs.

Hmm schrieb:
> Python : Da ist für mich völlig undurchsichtig, welche IDE/Editor und
> welches Framework da Sinn macht.
Qt fuer Python: PyQt. Um die Gui zumachen kann man den QtDesigner oder 
den QtCreator verwenden. Als Editor kann ein einfacher Texteditor 
reichen. Wenn es eine komplette IDE sein soll, dann ist vielleicht eric 
etwas. Damit sollte man auch die Guis designen koennen.
https://eric-ide.python-projects.org/

von Roland P. (pram)


Lesenswert?

Ich würde es vielleicht mit Autoit versuchen:

File system watcher:
https://www.autoitscript.com/autoit3/docs/libfunctions/_WinAPI_FindFirstChangeNotification.htm


Com Port
https://www.autoitscript.com/wiki/CommAPI_Examples

Zuerst mal als Konsolenanwendung, später dann eine GUI rum bauen.

Allerdings bist du dann auch auf Windows fixiert. Da bleibt dir dann 
wohl nur Java, Python oder Perl

/edit zum Zugriff auf die Com Schnittstelle brachst du meist auch eine 
weitere Library

VG Roland

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Hmm schrieb:
> Erkenntnisse bis jetzt: Ohne eine neue Programmiersprache (ich kann nur
> C halbwegs ordentlich)

machs doch mit lcc32 ist C und kann überall genutzt werden, jedenfalls 
der Quellcode

von Eierfreak (Gast)


Lesenswert?

Hmm schrieb:
> So einfach scheint das nicht zu sein :-(

Unser Lehrer (für Techniker) steigt mit absoluten Anfängern (da weiß 
keiner was ein Array ist, ohne Witz!) mit GUI-Programmierung in Java 
ein! Das ist so simpel, einfacher und schneller geht's (für Anfänger) 
nun wirklich nicht mehr.

Aber mit deiner Einstellung kannst du das gleich knicken...

Aber falls doch: Java mit Eclipse und Windowbuilder/JFrame? (verdammt, 
wie heißt das Plugin? )

von A.. P. (arnonym)


Lesenswert?

_Gast schrieb:
> Welches Programm würdet ihr mir empfelen für dieses Ziel

Delphi/Lazarus:

* Super GUI-Builder und reichlich Komponenten für dein Vorhaben
* Delphi ist eine recht einfache Sprache (der Vorgänger Pascal wurde ja 
auch als Lernsprache entworfen)

_Gast schrieb:
> könnt ihr mich dabei unterstützen

Dafür sind wir in diesem Forum und wir versuchen es :)

_Gast schrieb:
> hat jemand sowas schon mal gemacht

Grundsätzlich ein serielles Terminal entwickelt? Gibts dutzendfach im 
Netz (für allgemeine Anwendungsfälle). Für Spezialfälle hat sicher der 
ein oder andere auch schon seinen seriellen Monitor o.ä. mit eigenem 
Protokoll gebastelt. Ich hab's noch nicht gebraucht.

_Gast schrieb:
> möchte das vllt sogar jemand für mich machen?

Du wirst hier niemanden finden, der dir deine Arbeit vorkaut. 
scherz_on Ich könnte dir das aber freilich machen - 75€/h. 
Aufwandsschätzung würde auf dem von dir zu liefernden Pflichtenheft samt 
exakter Anforderungen deines speziellen Protokolls basieren. Ich könnte 
dich auch bei der Erstellung dessen unterstützen - 75€/h. Zzgl. evtl. 
Reisekosten & Spesen. scherz_off

Gruß

: Bearbeitet durch User
von _Gast (Gast)


Lesenswert?

Roland P. schrieb:
> Allerdings bist du dann auch auf Windows fixiert. Da bleibt dir dann
> wohl nur Java, Python oder Perl

Nur Windows reicht mir persönlich.
Habe mir gedacht das mit C++ zu machen ... habe ein wenig C bisher 
gemacht, schaut aber irgendwie total anders aus :)



Joachim B. schrieb:
> machs doch mit lcc32 ist C und kann überall genutzt werden, jedenfalls
> der Quellcode

Für C habe ich keinen Beispielcode gefunden für die Serielle 
Schnittstelle :(



Kurze Info:

Ich habe heute bereits den großteil des Tages da rein gesteckt und dies 
sind meine bisherigen Ergebnisse:

VisualStudio: 6GB ... ist das dein Ernst - nicht genug 
Festplattenspeicher
Netbeans: Hmmm schaut erst mal nicht schlecht aus, aber "noch" recht 
früh im Tutorial bereits überfordert
Dev-C++: Kompiliert nicht, alle Foreneinträge sagen "Nicht nutzen, 
veraltet"
CodeBlocks: Installiert ... muss los, keine Zeit mehr.

Aalso: Morgen Code::Blocks anschauen und QT habe ich auch mal herunter 
geladen.
Von mir aus kann es auch erst mal nur eine Konsolenanwendung sein, das 
Bunti kann später hinzu.

von Paul W. (solarturtle)


Lesenswert?

Mit Visual Studio in VB.net

Habe schon serielle Kommunikation mit einem Mikrocontroller gemacht, 
habe daher einiges was ich übernehmen könnte.

_Gast schrieb:
> möchte das vllt sogar jemand für mich machen?

Bis Dienstag Abend könnte ich dir eine Version programmieren, was schon 
die meisten deiner Funktionen beinhaltet. Wenn alles geht, kommen die 
letzten Feinheiten rein. 100€ sollten es aber schon sein, weil 10-15h 
Arbeit werden es insgesamt schon werden.

Schreib mir einfach bei Interesse.
Vg Paul

von Manfred (Gast)


Lesenswert?

Roland P. schrieb:
> Ich würde es vielleicht mit Autoit versuchen:

AutoIT kenne ich ziemlich gut und verfluche inzwischen, mich nicht 
gleich mit einer richtigen Programmierumgebung befasst zu haben. Jede, 
noch so kleine, Anwendung erzeugt über 800kB Code.

> Com Port
> https://www.autoitscript.com/wiki/CommAPI_Examples

Ich habe es noch nicht geschafft, einen COM-Port unter AutoIT wirklich 
anständig zu behandeln.

Rufus hat es sehr salomonisch formuliert:
Rufus Τ. F. schrieb:
> Das, das Du schon hast (oder kennst) und mit dem Du bereits umgehen
> kannst.
>
> Wenn Du so eines nicht hast, dann eines, wo ein persönlicher Bekannter
> von Dir mit umgehen kann,

Die Anforderungen sind weit über Kindergartenniveau, er muß sich in eine 
erwachsene Umgebung einarbeiten. Wegen der Nähe zu Mikrocontrollern 
würde ich aktuell zu QT tendieren wollen.

Eierfreak schrieb:
> Unser Lehrer (für Techniker) steigt mit absoluten Anfängern (da weiß
> keiner was ein Array ist, ohne Witz!) mit GUI-Programmierung in Java
> ein! Das ist so simpel, einfacher und schneller geht's (für Anfänger)
> nun wirklich nicht mehr.

Schreibe lieber "unser Leerer" - die Java-Fritzen klicken haufenweise 
Zeugs zusammen, schwingen große Sprüche und sind anschließend nicht 
schuld an Fehlfunktionen, weil sie ja vorhandene Klassen verwendet 
haben. Ich sehe die Javas in der Nähe der Arduinos, nur ein paar wenige 
verstehen, was sie tun.

Zumindest sind bei Java-Programmen die Install-CDs nicht unnötig leer 
und der Anwender freut sich, dass er sein RAM im PC nicht unnötig 
gekauft hat.

von Joachim B. (jar)


Lesenswert?

_Gast schrieb:
> Für C habe ich keinen Beispielcode gefunden für die Serielle
> Schnittstelle :(

echt jetzt?

ist doch Standard

handle holen open read write close

Anleitungen gibts reichlich imNetz
https://www.codeproject.com/Articles/8860/Non-Overlapped-Serial-Port-Communication-using-Win
1
HANDLE hCom;
2
        if(!WriteFile(hCom, &rs232_send, strlen(rs232_send), &iBytesWritten, NULL))
3
            {  LPVOID lpMsgBuf;
4
            FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
5
                             FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
6
                             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
7
            MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error: WriteFile", MB_OK | MB_ICONINFORMATION);
8
               LocalFree(lpMsgBuf);
9
          } // if(!WriteFile(hCom.......
10
          else
11
          {
12
/*
13
            printf(  "\n\n--------------------------------------------------------------------------\n"
14
                    "Wait for inputs from the serial port\n"
15
                    "Gets maximal 70 characters until a EndOfLine character (RETURN) is detected\n\n");
16
*/
17
//            if(*strrchr(rs232_out, ','))
18
//              *strrchr(rs232_out, ',')=0;
19
//            else
20
//              strcpy(rs232_out, "\"leer\"");
21
            strcpy(rs232_in, "");
22
            i = 0;
23
              do
24
            {  // look for a character in the input buffer
25
              ReadFile ( hCom, &rs232_in[i], 1, &BytesRead, NULL);
26
                if (BytesRead > 0)

von W.S. (Gast)


Lesenswert?

A.. P. schrieb:
> * Delphi ist eine recht einfache Sprache (der Vorgänger Pascal wurde ja
> auch als Lernsprache entworfen)

Da knurrt aber der Blindenhund!

Also:
- Delphi ist die Entwicklungsumgebung.
- VCL ist die benutzte Klassenbibliothek, bei Lazarus LCL oder so 
ähnlich
- und PASCAL ist die benutzte Programmiersprache.

Halte das doch bitte mal auseinander.



_Gast schrieb:
> Frage:
>
> Welches Programm würdet ihr mir empfelen für dieses Ziel, könnt ihr mich
> dabei unterstützen, hat jemand sowas schon mal gemacht, möchte das vllt
> sogar jemand für mich machen?

1. Empfehlung: Duden.
2. Für genau dein Ziel: selber nachdenken und selber schreiben. Gründe 
dazu weiter unten.
3. Mit gutgemeinten Ratschlägen unterstützt dich hier wohl jeder gern.
4. Ja, ich habe sowas schon gemacht. Für die PC Seite mittels Delphi, 
für die WinCE-Seite mittels EVC.
5. Nein, sowas würde ganz gewiß hier niemand für dich machen. Da ist 
(s.o.) selbermachen angesagt.

Im Grunde ist das Ganze ja keine Frage nach irgend einer 
Programmiersprache, sondern nach einem sinnvollen Procedere.

Also muß man sich zuerst Gedanken darüber machen, wie sich zwei 
unterschiedliche Geräte, die an jeweils einem Ende irgend einer 
Übertragungskette hängen, miteinander verständigen.

Als Erstes steht ein Synchronisieren an, also daß der eine dem anderen 
sagt, daß er ne Datei senden will. Sowas muß er vermutlich dezent 
wiederholen, weil er ja nicht weiß, ob de andere grad drangestöpselt ist 
und auch Zeit zum Zuhören hat. Der andere muß sich dann überlegen, ob er 
das Ansinnen annimmt und es dem einen auch mitteilen.

Als nächstes sollte man sich ein Blockformat aussuchen oder ausdenken. 
Bloß eine simple Prüfsumme reicht manchmal vielleicht aus, aber es 
müssen ja noch viele andere Dinge kommuniziert werden: Gesamtlänge, 
Dateiname, Blocknummer, usw... und zum Schluß sowas wie Adler32 o.ä.

Tja, und dann kommt die Frage nach einem ausreichenden Userinterface.

Also etwa so herum.

W.S.

von Possetitjel (Gast)


Lesenswert?

Hmm schrieb:

> So, wie ich das sehe, gibt es folgendes:
> QT (in C++), [...]
>
> Mit wxWidgets und C++ in Code::Blocks: [...]
>
> Python : [...]
>
> Java : Keinen Plan.
>
> Visual Studio:  [...]


Wie üblich fehlt Tcl/Tk.

von 900ss (900ss)


Lesenswert?

Ich hab hiermit schon schöne kleine Tools geschrieben.
Für viele Dinge gibt er fertige APIs.

http://www.purebasic.com/index.php

Es erzeugt kleine EXE-Dateien, man braucht keine zusätzlichen Runtimes.

PS. Ja, ist Basic und nicht C/C++.... Na und?

: Bearbeitet durch User
von pegel (Gast)


Lesenswert?

Ich hatte so etwas mit fluid/fltk (Linux) bzw. Quincy2005 (Win) gemacht.
Dazu eine Plattform unabhängige portableserial. Die finde ich z.Z. 
nicht,
diese scheint aber etwa das Gleiche zu sein:

https://www.teuniz.net/RS-232/

Ergibt auch kleine exe für Win und Linux.

Beitrag #5246148 wurde von einem Moderator gelöscht.
von A.. P. (arnonym)


Lesenswert?

W.S. schrieb:
> Da knurrt aber der Blindenhund!

Meinst du dich damit?

W.S. schrieb:
> Also: - Delphi ist die Entwicklungsumgebung.
> - VCL ist die benutzte Klassenbibliothek, bei Lazarus LCL oder so
> ähnlich
> - und PASCAL ist die benutzte Programmiersprache.
>
> Halte das doch bitte mal auseinander.

Vielen Dank, dass du das an dieser Stelle getan hast. Was täten wir alle 
nur ohne deine umgehende Erhellung?

Im Übrigen habe ich nichts von der VCL/LCL oder etwaigen weiteren 
Komponenten, wie z.B. den Jedi-Komponenten, erzählt. Das hast du jetzt 
noch mit ins Spiel gebracht. Aber natürlich hast du Recht, dass den 
Entwicklungsumgebungen Delphi/Lazarus (Handels-/Projektnamen) die 
Sprache Object Pascal zugrunde liegt. Ich denke aber, dass der 
interessierte Leser das auch von selbst auseinandergedröselt hätte, 
sofern ihn diese kleine Ungenauigkeit denn überhaupt gestört hätte.

Und außerdem: Hätte sich der TO tatsächlich für Delphi - pardon, Pascal 
- entschieden, so täte er gut daran, trotzdem mit dem Suchwort "Delphi", 
statt "Pascal", nach Hilfe zu suchen. Damit fände er nämlich 
einschlägigere Ergebnisse zu seiner Entwicklungsumgebung bzw. seinen 
Problemen, wenn er nicht gerade Hilfe für Turbo Pascal 5.0 sucht.

Gruß

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

Uiii, was da wiedermal für ein Bohei abgeht!

Serielle Schnittstellen werden unter allen Programmiersprachen gleich 
verwendet: ist schliesslich dieselbe HW für Alle, respektive derselbe 
Treiber + dieselbe Lib welche das kapselt und das ganze wird für alle 
Programme auf gleiche Weise vom Betriebssystem gestellt.

Die geschilderten Anforderungen sind definitiv standard & alltags 
Hausmannskost, ausser das Protokoll. Unter jedem gescheiten BS geht 
Dateiüberwachung, Fallentscheidung, serieller Transfer, etwas Warten, 
wiederholen in Schlaufe definitiv mit Bordmittel also ein wenig *shell 
scripting* .

(wenn ich richtig gelesen habe: das Protokoll ist NOCH NICHT vorgegeben)

Muss denn das Protokoll unbedingt ein Eigenbrau sein, der die ganzen 
Fehler der EDV-Geschichte abermals wiederholt? (diesmal ggfs. mit 
neuen Bugs...)
Dateitransfer über serielle Schnittstellen gibt es seit der 
Windelpupszeit der el. Telekommunikation und die bewärtesten davon sind 
sowieso als Libs vorhanden (und als Quellcode für den Fall dass die 
Gegenstelle ein uC ist).
Also nur anzapfen und nutzen. Warum nochmals neu erfinden UND neu 
implementieren?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

https://processing.org/

für alle Plattformen (win / mac /linux).

Beruht intern auf Java, Programmierung in C++ ...

von Eierfreak (Gast)


Lesenswert?

Manfred schrieb:
> Ich sehe die Javas in der Nähe der Arduinos, nur ein paar wenige
> verstehen, was sie tun.

Hehe, er macht auch "C" parallel auf einem Arduino ;D

OK, unser "Leerer" macht das zwar trotzdem gut, aber direkt in Java GUI 
ohne Vorkenntnisse einzusteigen, finde ich schon etwas arg.

Ich bin zwar auch kein Freund von Java, aber um schnell Ergebnisse zu 
erhalten die auch funktionieren, geht das echt gut. Und für's Hobby 
reicht das allemal aus. Vor allem, wenn das Programm nur ein paar mal 
verwendet werden soll und nicht 24/7 in der Industrie läuft...

von X4U (Gast)


Lesenswert?

_Gast schrieb:
> Welches Programm würdet ihr mir empfelen für dieses Ziel, könnt ihr mich
> dabei unterstützen, hat jemand sowas schon mal gemacht, möchte das vllt
> sogar jemand für mich machen?

Wäre eine Freelancer Seite etwas für dich?

> Bonus:
>
> Fehlersicherheit: Die Daten werden in Blöcken von z.B. 128Byte versendet
> wonach beispielsweise ein Paritätsbyte kommt.

Nimm ein Protokoll das es gibt und open source ist.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

X4U schrieb:
> Nimm ein Protokoll das es gibt und open source ist.

Uralter etablierter Standard: XMODEM.

https://en.wikipedia.org/wiki/XMODEM

Oder Y- bzw. ZMODEM, oder kermit. Eines davon beherrscht jedes 
ernstgemeinte Terminalprogramm.

: Bearbeitet durch User
von Hmm (Gast)


Angehängte Dateien:

Lesenswert?

Kaj G. schrieb:
> Hmm schrieb:
>> QT (in C++), aber da muss man sich offensichtlich registieren.
> https://www.qt.io/download-qt-for-application-development
> Einfach die Open Source Variante waehlen. Das sollte ohne Registrierung
> laufen. Ich weiss aber nicht, wie das unter Windows aussieht, bin nur
> auf Linux unterwegs.

Danke für den Tipp! Das klappt, und sieht erst mal vernünftig aus.

Nach 3 Stunden probiererei läuft das (Siehe Bild). Von wegen 
Installieren und loslegen. Mit der Standardinstallation ist es nicht 
getan.

Ich habe folgendes Tutorial verwendet:
https://wiki.qt.io/Qt_for_Beginners

Und jetzt heißt es erst mal C++ Büffeln. Naja, jammern hilft nicht.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Das Schreiben einer kleinen GUI und das
Senden und Empfangen über die ser. Schnittstelle
stellt wohl kaum eine Hürde dar. Je nachdem, welche
Programmiersprache man nimmt, ist es etwas mehr
oder weniger Aufwand.

Was etwas trivial sein wird :

_Gast schrieb:
> Anschließend soll diese Datei überwacht werden und immer wenn sich der
> Inhalt ändert soll diese neu gesendet werden. Es sollen sowohl Druckbare
> wie auch nicht Druckbare Zeichen gesendet werden, sodass die Datei beim
> Empfänger wieder zusammen gesetzt werden kann.

Wenn nun jemand die Datei mit z.B. dem Windows-Editor
ändert, wie soll das Programm denn das erkennen ?
Eine Windowsbotschaft gibt es wahrscheinlich nicht
und der Editor wird eine solche auch nicht an das
Hauptprogramm verschicken. Eine Änderung anhand der
Dateigröße abzufragen, ist auch nicht optimal. Was ist,
wenn nur ein paar Bytes abgeändert werden, die Dateigröße
aber bestehen bleibt ?

Sowas ginge, wenn man noch einen Editor (MultiEdit) ins
Hauptprogramm integriert, mit dem die Datei geändert werden muß.
Oder einen Editor als selbstgeschriebenes Programm, der beim
Speichern eine selbstdefinierte Windowsbotschaft an das Fenster
des Hauptprogramms schickt und dieses dann diese Botschaft
auswertet.

von Sheeva P. (sheevaplug)


Lesenswert?

Hmm schrieb:
> Python : Da ist für mich völlig undurchsichtig, welche IDE/Editor und
> welches Framework da Sinn macht.

Für so einfaches Zeug reichen Tkinter bzw. Tix (letzteres ist eine etwas 
hübschere Erweiterung zu Tkinter). Was der TO gezeichnet hat, würde dann 
ohne große Funktionalität und Politur etwa so aussehen:
1
#!/usr/bin/python
2
# *-* coding: utf-8 *-*
3
import Tix as T
4
import tkFileDialog as tFD
5
import os
6
7
class MyLabel(T.Label):
8
    def __init__(self, *args, **kwargs):
9
        kwargs['padx'] = 5
10
        kwargs['pady'] = 5
11
        kwargs['borderwidth'] = 2
12
        kwargs['background'] = 'white'
13
        kwargs['relief'] = T.SUNKEN
14
        T.Label.__init__(self, *args, **kwargs)
15
        
16
17
class MainWin(T.Tk):
18
    def __init__(self, *args, **kwargs):
19
        T.Tk.__init__(self, *args, **kwargs)
20
        self.title('Kopfzeile von Windows mit Programmnamen')
21
22
        self.topFrame = T.Frame(self, padx=5, pady=5, bd=2,
23
                                relief=T.SUNKEN)
24
        self.lblCom = MyLabel(self.topFrame,
25
                              text='COM #')
26
        self.lblCom.pack(side=T.LEFT)
27
        self.lblBaud = MyLabel(self.topFrame,
28
                               text='Baudrate')
29
        self.lblBaud.pack(side=T.LEFT)
30
        self.lblFile = MyLabel(self.topFrame,
31
                               text='Ausgewählte Datei')
32
        self.lblFile.pack(side=T.LEFT)
33
        self.btnFile = T.Button(self.topFrame,
34
                                text='...',
35
                                command=self.askFile)
36
        self.btnFile.pack(side=T.LEFT)
37
        self.topFrame.pack(side=T.TOP)
38
39
        self.txtCom = T.Text(self, width=48, height=12)
40
        self.txtCom.pack(side=T.TOP)
41
42
        self.txtCom.insert(T.END, "COM Kommunikation\n\n" +
43
                           "< vom Rechner gesendete Nachricht\n" +
44
                           "> Empfangene Nachricht")
45
46
        self.lblBottom = MyLabel(self,
47
                                 text='Letzte Nachricht ' +
48
                                 'mit bestimmter Syntax ' +
49
                                 '(Last Status)')
50
        self.lblBottom.pack(side=T.TOP)
51
52
        
53
    def askFile(self):
54
        filename = tFD.askopenfilename(title='Open File')
55
        self.lblFile.config(text=os.path.basename(filename))
56
        
57
58
if __name__ == '__main__':
59
    MainWin().mainloop()

von W.S. (Gast)


Lesenswert?

A.. P. schrieb:
> Vielen Dank, dass du das an dieser Stelle getan hast. Was täten wir alle
> nur ohne deine umgehende Erhellung?

Oh bittesehr.

Und was "wir alle" (womit du dich selber gemeint hast) tätest, ist ganz 
klar: Du würdest ohne diese Erhellung immer noch ohne Orientierung im 
Dunkeln herumtappen.

Genau dieses Phänomen sehe ich bei sehr vielen Anfragen im Stile 
dieses Threads: Der TO hat zwar ein Vorhaben, schafft es jedoch nicht, 
selbiges wirklich mit der nötigen Gründlichkeit zu formulieren. Siehe: 
"Vorwort: Ich bräuchte ein Programm auf Windows, um bei der Änderung 
einer Datei, diese über UART zu senden."

Wer ändert da welche Datei? Wer überprüft da, ob diese Datei geändert 
wurde und wer sendet diese dann an wen und wer ist der Empfänger (bare 
metal oder App in anderem OS?). Je schwammiger die Fragen sind, desto 
heftiger ist die Notwendigkeit der Präzisierung.

Kurzum, Fragen über Fragen. Eine davon hab ich ja nun final geklärt. 
Gelle?

W.S.

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

> Wenn nun jemand die Datei mit z.B. dem Windows-Editor
> ändert, wie soll das Programm denn das erkennen ?

Durch regelmässiges abfragen der Dateimetadaten wie "letzter 
Zugriffszeitpunkt" und " letzter Schreibzeitpunkt"?
Jedes Dateisystem dass diesen Namen verdient hält solche Metadaten pro 
Datei vor...

> Eine Windowsbotschaft gibt es wahrscheinlich nicht
Schau an: ein Nicht-Betriebssystem...

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Programmiersprachentheaterintendant schrieb:
> Durch regelmässiges abfragen der Dateimetadaten wie "letzter
> Zugriffszeitpunkt" und " letzter Schreibzeitpunkt"?
> Jedes Dateisystem dass diesen Namen verdient hält solche Metadaten pro
> Datei vor...

Klärt aber immer noch nicht, ob was beim letzten Schreibzeitpunkt
geändert wurde oder ob nur einfach neu gespeichert wurde.

Von daher auch nur sub-optimal !!!!

von Manfred (Gast)


Lesenswert?

900ss D. schrieb:
> http://www.purebasic.com/index.php
> Es erzeugt kleine EXE-Dateien, man braucht keine zusätzlichen Runtimes.

Damit hat ein Kollege früher PC-basierte Prüfsysteme geschrieben, lief 
gut. Scheint aus der Mode zu sein. Ich selbst hatte MS-PDS-Basic im 
Einsatz, aber nie probiert, ob das auf aktuellen Umgebungen noch zur 
Funktion zu bewegen ist.

Eierfreak schrieb:
> Ich bin zwar auch kein Freund von Java, aber um schnell Ergebnisse zu
> erhalten die auch funktionieren, geht das echt gut. Und für's Hobby
> reicht das allemal aus. Vor allem, wenn das Programm nur ein paar mal
> verwendet werden soll und nicht 24/7 in der Industrie läuft...

Java bedeutet in meinen Augen immer "Groß und langsam", ich benutze 
gerne mal einen meiner kleinen PCs. Und ja, ich kenne Java-Software, die 
24/7 laufen muß, meine Begeisterung ist sehr begrenzt.

Hmm schrieb:
> Nach 3 Stunden probiererei läuft das (Siehe Bild).

Du hast schon einmal Ausdauer für den Einstieg bewiesen, fühle Dich 
gelobt :-)

> Von wegen Installieren und loslegen. Mit der Standardinstallation ist es nicht
> getan.

tja ...

> Und jetzt heißt es erst mal C++ Büffeln. Naja, jammern hilft nicht.

Wenn Du das wirklich durchziehst, wird es sich langfristig sicherlich 
auszahlen, mach' weiter!

von Rolf M. (rmagnus)


Lesenswert?

Heinz B. schrieb:
> Wenn nun jemand die Datei mit z.B. dem Windows-Editor
> ändert, wie soll das Programm denn das erkennen ?

Indem es sich vom System benachrichtigen lässt:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261(v=vs.85).aspx

Bzw, da Qt erwähnt wurde - da gibt's schon fertige Klassen für sowas:
http://doc.qt.io/qt-5/qfilesystemwatcher.html

Oder in Python:
https://pypi.python.org/pypi/watchdog

: Bearbeitet durch User
von Sheeva P. (sheevaplug)


Lesenswert?

Programmiersprachentheaterintendant schrieb:
>> Wenn nun jemand die Datei mit z.B. dem Windows-Editor
>> ändert, wie soll das Programm denn das erkennen ?
>
> Durch regelmässiges abfragen der Dateimetadaten wie "letzter
> Zugriffszeitpunkt" und " letzter Schreibzeitpunkt"?
> Jedes Dateisystem dass diesen Namen verdient hält solche Metadaten pro
> Datei vor...

Sorry, aber Polling ist irgendwie ziemlich Siebziger... Und ich weiß 
zwar nicht, wie das unter Windows ist, aber unter Linux (und IIRC auch 
unter Solaris) kannst Du Änderungen an diesen Metadaten über die 
Mountoptionen abschalten.

>> Eine Windowsbotschaft gibt es wahrscheinlich nicht
> Schau an: ein Nicht-Betriebssystem...

Diese hier haben gewisse Ähnlichkeiten mit Linux' inotify:

https://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx

https://docs.microsoft.com/de-de/dotnet/api/system.io.filesystemwatcher?view=netframework-4.7.1

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

Sheeva P. schrieb:
> Programmiersprachentheaterintendant schrieb:
:
> Sorry, aber Polling ist irgendwie ziemlich Siebziger...
:
> Diese hier haben gewisse Ähnlichkeiten mit Linux' inotify:
>
> https://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx
>
> https://docs.microsoft.com/de-de/dotnet/api/system.io

Natürlich FULL ACK, bereits im voraus!
Jetzt kommen auch die Fleischstücke auf den Diskussionstisch  :-) und 
der TO bekommt guten Mehrwert zu den sonst bloss... naiven Antworten.

von Zeno (Gast)


Lesenswert?

Heinz B. schrieb:
> Klärt aber immer noch nicht, ob was beim letzten Schreibzeitpunkt
> geändert wurde oder ob nur einfach neu gespeichert wurde.
>
> Von daher auch nur sub-optimal !!!!

Indem man bei jeder Prüfung der Datei eine Prüfsumme ablegt. Wenn die 
Prüfsumme bei der nächsten Prüfung eine andere ist, wurde vermutlich was 
geändert ansonsten nicht.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Weil es mich auch interessiert, werde ich mich mal
durch die API wursteln.

PS:

Sheeva P. schrieb:
> Sorry, aber Polling ist irgendwie ziemlich Siebziger... Und ich weiß
> zwar nicht, wie das unter Windows ist, aber unter Linux (und IIRC auch
> unter Solaris) kannst Du Änderungen an diesen Metadaten über die
> Mountoptionen abschalten.

Polling braucht man dazu gar nicht. Das Abfragen von
Windowsnachrichten erledigt man üblicherweise in der
Warteschleife, in der auch die anderen GUI-Elemente
(wie Buttons etc.) abgefragt werden.

Bei Purebasic, XProfan usw. werden nur die wichtigen
Nachrichten vom Eventsystem behandelt, um den Programmierer
nicht schon gleich mit massenweisen Nachrichten zu erschlagen.

Das hält aber nicht davon ab, andere Windowsnachrichten
oder gar selbstdefinierte Botschaften selber zu behandeln.
Die braucht man nur zu definieren und z.B. über den Notifycode
abfragen.

von Zeno (Gast)


Lesenswert?

Heinz B. schrieb:
> Polling braucht man dazu gar nicht. Das Abfragen von
> Windowsnachrichten erledigt man üblicherweise in der
> Warteschleife, in der auch die anderen GUI-Elemente
> (wie Buttons etc.) abgefragt werden.

Welche konkrete Windowsnachricht willst Du da abfangen? Ich wüßte keine 
die sagt das die Datei XY verändert wurde. Ich laß mich da aber gern 
eines besseren belehren.

Am Polling wird da wohl nichts vorbei gehen. Ich würde bei der Sache gar 
nicht auf die Dateiattribute setzen, obwohl das auch mein erster Ansatz 
war. Ich würde in geeigneten Abständen eine Prüfsumme bilden. Sobald 
sich diese verändert, wurde auch die Datei verändert. Das wäre dann der 
Trigger.

von Rolf M. (rmagnus)


Lesenswert?

Zeno schrieb:
> Am Polling wird da wohl nichts vorbei gehen.

Alle Postings, die beweisen, dass das Blödsinn ist, überlesen?

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

z.B. diese da :

FILE_NOTIFY_CHANGE_LAST_WRITE (0x00000010)
in Verbindung mit der API-Funktion FindFirstChangeNotification

Mal sehen, da gibt es auch Möglichkeiten mit .Net usw.
Und da gibt es was, mit Übergabe eines Fensterhandle,
wo das entsprechende Fenster informiert wird.

: Bearbeitet durch User
von Sheeva P. (sheevaplug)


Lesenswert?

Heinz B. schrieb:
> Sheeva P. schrieb:
>> Sorry, aber Polling ist irgendwie ziemlich Siebziger... Und ich weiß
>> zwar nicht, wie das unter Windows ist, aber unter Linux (und IIRC auch
>> unter Solaris) kannst Du Änderungen an diesen Metadaten über die
>> Mountoptionen abschalten.
>
> Polling braucht man dazu gar nicht. Das Abfragen von
> Windowsnachrichten erledigt man üblicherweise in der
> Warteschleife, in der auch die anderen GUI-Elemente
> (wie Buttons etc.) abgefragt werden.

Auch das ist am Ende nichts anderes als Polling, egal wo genau Du es 
jetzt konkret abfackelst. Der Trick von zum Beispiel Linux' inotify-Api 
ist aber, daß der Kernel entsprechende Hooks zur Überwachung anbietet 
und seinerseits quasi selbständig die zuvor registrierte Aktion auslöst, 
sobald dann das zu überwachende Event eintritt.

von A.. P. (arnonym)


Lesenswert?

W.S. schrieb:
> Du würdest ohne diese Erhellung immer noch ohne Orientierung im Dunkeln
> herumtappen.

Sicherlich nicht. Ich habe schon vor Jahren professionell mit Delphi 
Anwendungen entwickelt und war tief in der Materie drin. Und wo man in 
diesem Feld auch unterwegs war, sprachen auch alle von "Delphi", statt 
von "Pascal", und jeder wusste, was gemeint ist. Und wenn 
"Delphi"-Entwickler gesucht werden, sind damit ganz gewiss nicht 
Personen gemeint, die nur unter Borland/Embarcadero/CodeGear Delphi 
entwickeln, sondern die Delphi als Sprache beherrschen.

Also spiel dich jetzt mal hier nicht auf, nur weil du mal einen Begriff 
gelesen hast, mit dem auch du was anfangen konntest. Ich wollte den TO 
lediglich mit der Nase auf die Entwicklungsumgebung stupsen.

W.S. schrieb:
> Kurzum, Fragen über Fragen. Eine davon hab ich ja nun final geklärt. Gelle?

Nein, hast du nicht. Deinen ganzen Aussagen lag nicht eine Frage 
zugrunde, du hast nur wieder mal ein bisschen rumgeklugscheißert.

von Bernd K. (prof7bit)


Lesenswert?

Sheeva P. schrieb:
> Der Trick von zum Beispiel Linux' inotify-Api
> ist aber, daß der Kernel entsprechende Hooks zur Überwachung anbietet

Geht inotify nicht auch nur ganz normal mit Read-Events für Handles auf 
die man blockierend mit select() oder poll() oder read() warten muss? 
IMHO scheint mir das der exakt selbe Mechanismus in grün zu sein. Ich 
hab da nix von irgendwelchen Callbacks oder Hooks gelesen die der Kernel 
höchstpersönlich aufrufen soll.

Ich hab auch sonst noch in keinem Userland code irgendwelche 
Hook-Funktionen gesehen die der Kernel höchstpersönlich ausführen soll, 
da wären ja Tür und Tor geöffnet.

: Bearbeitet durch User
von Sheeva P. (sheevaplug)


Lesenswert?

Bernd K. schrieb:
> Geht inotify nicht auch nur ganz normal mit Read-Events für Handles auf
> die man blockierend mit select() oder poll() oder read() warten muss?
> [...]
> IMHO scheint mir das der exakt selbe Mechanismus in grün zu sein.

Ein klassisches Polling würde immer wieder die Metadaten des 
Dateisystems auslesen, bis es eine Änderung daran feststellt. Durch das 
ständige Lesen werden Ressourcen zum Lesen und Vergleichen der Metadaten 
verbraucht.

Inotify(7) setzt auf Events auf, die durch Aufruf der 
Dateisystemfunktionen ausgelöst werden und die blockierenden Calls 
freigeben. Die Freigabe dieser blockierenden Calls ist dann die 
Nachricht für das aufrufende Programm, daß eins der überwachten Events 
aufgetreten ist.

Bei inotify(7) passiert also nur dann was, wenn tatsächlich ein Event 
zur Verarbeitung ansteht. Ansonsten blockiert der Syscall kommod vor 
sich hin, und verbraucht dabei keine Ressourcen.

von Rolf M. (rmagnus)


Lesenswert?

Sheeva P. schrieb:
> Bei inotify(7) passiert also nur dann was, wenn tatsächlich ein Event
> zur Verarbeitung ansteht. Ansonsten blockiert der Syscall kommod vor
> sich hin, und verbraucht dabei keine Ressourcen.

Das scheint mir aber bei der Windows-Variante auch nicht anders. Auch da 
nutzt man einen blockierenden Aufruf, um auf Events zu warten. Oder 
gehst du davon aus, dass diese Windows-Umsetzung dann intern pollt?

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Wenn man in etwa weiß, wie Windows tickt (arbeitet),
ist es doch ganz einfach. Ohne Polling des Eventsystems,
sei es nun intern durch die Programmiersprache oder
durch eine selber gemachte Eventschleife, funktioniert
kein Windowsprogramm mit GUI-Elementen so richtig.

Wie sollte man auch sonst abfrgaen, ob z.B. ein
Button gedrückt wurde ? Wenn das nicht in einer
Schleife geschieht, könnte man einen Button auch
nur einmal drücken und das Programm wäre zu Ende.

Also ist das Polling sowieso schon da. Ob man da
noch weitere Events bzw. Botschaften registriert
und abfrägt, ist nur Beiwerk.

Die Abfrage in solchen Systemen wird halt auf das
Nötigste reduziert, damit das Programm später
keinen Performanceverlust erleidet.

Man stelle sich vor, man würde alle möglichen
Nachrichten bzw. Events kontinuierlich in einer
Schleife abfragen. Das Programm würde arschlangsam
werden oder würde sich sogar nur schwer bedienen
lassen.

Dafür ist man dazu übergegangen, die für das Programm
zusätzlichen interessanten Nachrichten selber abfangen
zu können. Da dies i.d.R. sehr wenige sind, wird das
gesamte System nicht sonderlich damit belastet.

: Bearbeitet durch User
von Sheeva P. (sheevaplug)


Lesenswert?

Rolf M. schrieb:
> Das scheint mir aber bei der Windows-Variante auch nicht anders. Auch da
> nutzt man einen blockierenden Aufruf, um auf Events zu warten. Oder
> gehst du davon aus, dass diese Windows-Umsetzung dann intern pollt?

Ich habe keine Ahnung von Windows und weiß deswegen nicht, wie Windows 
das macht. Tatsächlich würde ich vermuten, daß Windows das ähnlich 
handhabt wie Linux, aber, wie gesagt: ich weiß es nicht.

von Sheeva P. (sheevaplug)


Lesenswert?

Heinz B. schrieb:
> Wenn man in etwa weiß, wie Windows tickt (arbeitet),
> ist es doch ganz einfach. Ohne Polling des Eventsystems,
> sei es nun intern durch die Programmiersprache oder
> durch eine selber gemachte Eventschleife, funktioniert
> kein Windowsprogramm mit GUI-Elementen so richtig.

Die von Dir angesprochene Eventloop läuft aber im Userspace und leidet 
für den Fall, daß ständig Dateiattribute abgerufen werden müssen, 
darunter, daß dabei jedes Mal ein teurer Kontextwechsel zwischen 
Usermode (Eventloop) und Kernelmode (Dateisystemtreiber) stattfinden und 
eben immer wieder dieselben Dateisystemattribute gelesen und verglichen 
werden müssen. Das wäre leider hochgradig ineffizient und eben: Polling. 
Probier's halt aus: wenn Du kein Delay in Deine Poll-Schleife einbaust, 
belegt das 100% eines CPU-Kerns.

Tatsächlich würde ich nach der von mir oben verlinkten Dokumentation von 
FindFirstChangeNotification und FileSystemWatcher erwarten, daß Windows 
intern ebenfalls mit Dateisystemevents auf Kernelebene arbeitet. Im 
ersten Fall kann das von FindFirstChangeNotification zurückgegebene 
Handle mit blockierenden Wait-Operationen verwendet werden (die 
blockieren und erst zurückkehren, wenn eins der gesuchten 
Dateisystemevents ausgelöst wird, ähnlich wie unter Linux' inotify). Im 
zweiten Fall werden dem erzeugten FileSystemWatcher eine oder mehrere 
Callback-Funktionen mitgegeben, die aufgerufen werden, wenn das 
entsprechende Event ausgelöst wird.

All dies ist -- wenn ein Windows-Spezialist das besser weiß, möge er 
mich bitte korrigieren -- völlig unabhängig von den Eventloops einer 
GUI.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Ich denke mal, daß die Systemevents auch immer ausgelöst werden.
Die sind aber Fenster-unabhängig. Es gibt ja auch eine API, der
man ein Fensterhandle mitgibt, an das dann der Systemevent
geschickt wird.

Wenn man anders herum mal den Eventloop betrachtet :
Einen Button-Click gibt es ja in dem Sinne eigentlich
nicht. Der setzt sich aus den Mausklicks Button_down,
Button_up zusammen. Und wenn diese auch noch in der
Clientarea des Fensters (ja - auch ein Button ist für
Windows nur ein Fenster) stattfinden, ist es ein
Klick auf einen Button. Und wie man sieht, sind das
ja System bzw. Hardware - Events (Kernelfunktionen),
die erst mal nichts mit Fenstern zu tun haben.

Ich wußte das vorher auch nicht, erst als ich mich mal
vor Jahren mit SubClassing von Fenstern beschäftigte,
fand ich das heraus.

Und gerade das SubClassing ermöglicht es ja, daß sich
die originale Windowprozedur nicht um jeden Furz kümmern
muß. Es gibt Programmiersprachen, bei denen man sich
beim Subclassen dann auch noch selber um den Klick
kümmern muß, was sonst das Programmiersystem macht.
Bei anderen Sprachen wiederum, muß man sich nur um den
extra zu bearbeitenden Event kümmern. Den Rest erledigt
das Programmiersystem.

Also, soweit auseinander liegen diese Sachen gar nicht.

von Carl D. (jcw2)


Lesenswert?

Sheeva P. schrieb:
> Tatsächlich würde ich nach der von mir oben verlinkten Dokumentation von
> FindFirstChangeNotification und FileSystemWatcher erwarten, daß Windows
> intern ebenfalls mit Dateisystemevents auf Kernelebene arbeitet. Im
> ersten Fall kann das von FindFirstChangeNotification zurückgegebene
> Handle mit blockierenden Wait-Operationen verwendet werden (die
> blockieren und erst zurückkehren, wenn eins der gesuchten
> Dateisystemevents ausgelöst wird, ähnlich wie unter Linux' inotify). Im
> zweiten Fall werden dem erzeugten FileSystemWatcher eine oder mehrere
> Callback-Funktionen mitgegeben, die aufgerufen werden, wenn das
> entsprechende Event ausgelöst wird.
>
> All dies ist -- wenn ein Windows-Spezialist das besser weiß, möge er
> mich bitte korrigieren -- völlig unabhängig von den Eventloops einer
> GUI.

FileChangeNotifications sind Kernel-Objekte, auf die man blockierend 
warten kann. Da aber Windows-GUI-Threads von einer MessageLoop abhängig 
sind, kann man auch warten auf Kernel-Objekte und eintreffende 
Messages, die dann gleich dispatched werden. Und worauf man wartet, kann 
sehr fein eingestellt werden, z.B. "Schreiben auf Datei in Ordner xyz". 
Nur diese lösen einen Contextswitch aus. Messages natürlich auch, denn 
die Message-Queue ist nur ein weiteres Objekt auf das gewartet wird. Ich 
meine mich erinnern zu können (hab das letztesmal zu Win2000-Zeiten 
gemacht), daß mit MessageLoop ein Kernel-Objwerkt weniger in die 
WarteListe paßt, eben wegen der Message-Queue. Die CSe durch Messages 
stören aber nicht, denn man möchte diese ja gerade parallel zum Warten 
verarbeiten. Ohne GUI geht's natürlich auch ohne MessageLoop.

von Sheeva P. (sheevaplug)


Lesenswert?

Carl D. schrieb:
> FileChangeNotifications sind Kernel-Objekte, auf die man blockierend
> warten kann. Da aber Windows-GUI-Threads von einer MessageLoop abhängig
> sind, kann man auch warten auf Kernel-Objekte und eintreffende
> Messages, die dann gleich dispatched werden.

Wenn Du in einer GUI-MessageLoop blockierend auf etwas wartest, 
blockiert sie. Das heißt, die Eingabeevents können für die Dauer der 
Blockade nicht mehr verarbeitet und die GUI also nicht mehr bedient 
werden.

> Und worauf man wartet, kann sehr fein eingestellt werden, z.B.
> "Schreiben auf Datei in Ordner xyz".

Man kann einstellen, für welche Ereignisse der Betriebssystemkernel ein 
Event auslöst.

> Nur diese lösen einen Contextswitch aus.

Unter Linux und Solaris ist es jedenfalls so, daß beim klassischen 
Polling jeder *stat(2)-Call einen Kontextwechsel auslöst. Es würde mich 
wundern, wenn der Windows-Kernel das anders handhaben würde (oder 
könnte). Immerhin reden wir hier von Events, die von 
Dateisystemfunktionen ausgelöst werden, und das Dateisystem gehört IMHO 
auch unter Windows zum Kernel.

> Messages natürlich auch, denn die Message-Queue ist nur ein weiteres
> Objekt auf das gewartet wird.

Ja, aber da der Userspace-Syscall unterdessen blockiert und der 
aufrufende Thread in der Zeit zwischen Aufruf und Event einfach nur gar 
nichts tut und untätig vor sich hin wartet, findet in diesem Falle nur 
genau ein einziger Kontextwechsel statt: nämlich dann, wenn das Event 
eintritt und der Kernel den Userspace-Code darüber benachrichtigt, indem 
er den blockierenden Syscall zurückkehren läßt und also dessen Blockade 
beendet.

Polling bedeutet, etwas viele Male zu lesen, nur um eine einzige 
Änderung mitzubekommen. Effizienter ist, vom Kernel Nachrichten für die 
gewünschten Events anzufordern und sich dann schlafen zu legen, bis er 
eine ebensolche Nachricht schickt. Genau deswegen gibt es solche 
Benachrichtigungssysteme im Kernel wie inotify und die genannten 
Windows-Äquivalente doch. Wenn man das auch nur annäherungsweise ähnlich 
effizient mit einer GUI-Messageloop oder sogar mittels Polling 
hinbekommen könnte, wären diese Subsysteme und Funktionen komplett 
nutzlos und überflüssig. :-)

von Rolf M. (rmagnus)


Lesenswert?

Sheeva P. schrieb:
> Immerhin reden wir hier von Events, die von
> Dateisystemfunktionen ausgelöst werden, und das Dateisystem gehört IMHO
> auch unter Windows zum Kernel.

Ob nun Kernel oder nicht, ist egal. Das Dateisystem wird definitiv in 
einem anderen Kontext ausgeführt. Es kann ja nicht jeder Prozess seine 
eigene Instanz des Dateisystems laufen lassen.

von Carl D. (jcw2)


Lesenswert?

Sheeva P. schrieb:
> Carl D. schrieb:
>> FileChangeNotifications sind Kernel-Objekte, auf die man blockierend
>> warten kann. Da aber Windows-GUI-Threads von einer MessageLoop abhängig
>> sind, kann man auch warten auf Kernel-Objekte und eintreffende
>> Messages, die dann gleich dispatched werden.
.
> Wenn Du in einer GUI-MessageLoop blockierend auf etwas wartest,
> blockiert sie. Das heißt, die Eingabeevents können für die Dauer der
> Blockade nicht mehr verarbeitet und die GUI also nicht mehr bedient
> werden.
.
>> Und worauf man wartet, kann sehr fein eingestellt werden, z.B.
>> "Schreiben auf Datei in Ordner xyz".
>
> Man kann einstellen, für welche Ereignisse der Betriebssystemkernel ein
> Event auslöst.
.
>> Nur diese lösen einen Contextswitch aus.
>
> Unter Linux und Solaris ist es jedenfalls so, daß beim klassischen
> Polling jeder *stat(2)-Call einen Kontextwechsel auslöst. Es würde mich
> wundern, wenn der Windows-Kernel das anders handhaben würde (oder
> könnte). Immerhin reden wir hier von Events, die von
> Dateisystemfunktionen ausgelöst werden, und das Dateisystem gehört IMHO
> auch unter Windows zum Kernel.
>
>> Messages natürlich auch, denn die Message-Queue ist nur ein weiteres
>> Objekt auf das gewartet wird.
>
> Ja, aber da der Userspace-Syscall unterdessen blockiert und der
> aufrufende Thread in der Zeit zwischen Aufruf und Event einfach nur gar
> nichts tut und untätig vor sich hin wartet, findet in diesem Falle nur
> genau ein einziger Kontextwechsel statt: nämlich dann, wenn das Event
> eintritt und der Kernel den Userspace-Code darüber benachrichtigt, indem
> er den blockierenden Syscall zurückkehren läßt und also dessen Blockade
> beendet.
>
> Polling bedeutet, etwas viele Male zu lesen, nur um eine einzige
> Änderung mitzubekommen. Effizienter ist, vom Kernel Nachrichten für die
> gewünschten Events anzufordern und sich dann schlafen zu legen, bis er
> eine ebensolche Nachricht schickt. Genau deswegen gibt es solche
> Benachrichtigungssysteme im Kernel wie inotify und die genannten
> Windows-Äquivalente doch. Wenn man das auch nur annäherungsweise ähnlich
> effizient mit einer GUI-Messageloop oder sogar mittels Polling
> hinbekommen könnte, wären diese Subsysteme und Funktionen komplett
> nutzlos und überflüssig. :-)

Einfach mal die Doku zu MsgWaitForMultipleObjects durchlesen
https://msdn.microsoft.com/de-de/library/windows/desktop/ms684242(v=vs.85).aspx
dann fällt das ein oder andere Raten wie es sein müßte weg.

Sorry, normalerweise kenne ich von dir eigentlich fundierte Kommentare, 
aber beim aktuellen Thema fehlt es anscheinend an Grundlagen.

Windows ist eigentlich für mich was nervtötendes, ich benutze das nur 
unter Zwang. Aber unter dem maroden Krempel werkelt aber ein Kernel, der 
früher mal VMS hieß und der, schon bevor B.Gates den Hern Cutler 
eingekauft hat, Dinge konnte, die sich manche offensicht auch heute noch 
nicht vorstellen können. Nicht ohne Grund wurde VMS auf Proczessrechnern 
eingesetzt, da ist Pollen verpönt. Leider scheint man irgendwann 
aufgehört zu haben, VMS bzw. seine Konzepte in der Lehre zu behandeln.

von Sheeva P. (sheevaplug)


Lesenswert?

Rolf M. schrieb:
> Sheeva P. schrieb:
>> Immerhin reden wir hier von Events, die von
>> Dateisystemfunktionen ausgelöst werden, und das Dateisystem gehört IMHO
>> auch unter Windows zum Kernel.
>
> Ob nun Kernel oder nicht, ist egal. Das Dateisystem wird definitiv in
> einem anderen Kontext ausgeführt. Es kann ja nicht jeder Prozess seine
> eigene Instanz des Dateisystems laufen lassen.

Richtig, deswegen macht das der Kernel, und genau deswegen sind Abfragen 
von Metadaten des Dateisystems auch immer mit einem teuren 
Kontextwechsel zwischen User- und Kernelspace verbunden. Und das ist nur 
einer der vielen Gründe, die klassisches Polling so teuer machen im 
Vergleich zu modernen Event Notification APIs -- und aus denen man kein 
Polling, sondern diese modernen APIs benutzen will.

Schau, es ist ganz einfach: ich kann täglich zehnmal zum Briefkasten 
gehen und schauen, ob Post da ist. Oder ich kann mich darauf verlassen, 
daß mein Briefträger beim Einlegen der Post das kleine Fähnchen 
hochgeklappt hat um mir dadurch mitzuteilen, daß ich nach der Post 
schauen soll. Welche dieser beiden Vorgehensweisen ist wohl effizienter? 
Jawoll Scheff, janz jenau.

Und so ist das auch mit Event Notifications bei Dateisystemevents: die 
Dateisystemfunktionen, die die Dateien und ihre Metadaten ändern, sind 
schließlich immer die Ersten und wissen am Besten, wenn sie Dateien oder 
deren Metadaten ändern. Was liegt dabei näher, als diese Funktionen mit 
entsprechenden Fähigkeiten auszustatten, um interessierte Programme im 
Userspace über diese Änderungen zu benachrichtigen?

Egal, ob das inotify unter Linux oder OpenBSD, 
FindFirstChangeNotification unter Windows, FileSystemWatcher unter .NET, 
kqueue/kevent unter *BSD oder die Event Notifications unter AIX sind: 
jedes dieser Systeme hat eigens für diesen Zweck jeweils eigene 
Mechanismen. Weil jeder Systemhersteller weiß, wie extrem ineffizient 
und teuer so ein klassisches Polling ist.

Deswegen ist es mir ehrlich völlig schleierhaft, warum wir hier eine 
rückwärtsgerichtete Diskussion darüber führen müssen, daß man ja doch 
irgendwie ein klassisches Polling machen könne. Natürlich kann man das 
machen. Aber dann ist es halt Scheiße. Das ist und bleibt es auch dann, 
wenn man irgendwelchen esoterischen Hokuspokus betreibt wie eine 
GUI-Eventloop dafür zu vergewaltigen -- wobei heutige Eventloops ja 
schon längst kein Polling mehr machen, sondern auch nur auf Events 
warten.

von Sheeva P. (sheevaplug)


Lesenswert?

Carl D. schrieb:
> Einfach mal die Doku zu MsgWaitForMultipleObjects durchlesen
> https://msdn.microsoft.com/de-de/library/windows/desktop/ms684242(v=vs.85).aspx
> dann fällt das ein oder andere Raten wie es sein müßte weg.

Wenn ich das richtig sehe, macht das etwas Ähnliches wie select(2): 
wartet darauf, daß eines der angegebenen Event-Subsysteme eines der 
konfigurierten Events meldet.

> Sorry, normalerweise kenne ich von dir eigentlich fundierte Kommentare,
> aber beim aktuellen Thema fehlt es anscheinend an Grundlagen.

Anscheinend nicht, denn...

> Windows ist eigentlich für mich was nervtötendes, ich benutze das nur
> unter Zwang. Aber unter dem maroden Krempel werkelt aber ein Kernel, der
> früher mal VMS hieß und der, schon bevor B.Gates den Hern Cutler
> eingekauft hat, Dinge konnte, die sich manche offensicht auch heute noch
> nicht vorstellen können. Nicht ohne Grund wurde VMS auf Proczessrechnern
> eingesetzt, da ist Pollen verpönt.

...das ist doch genau mein Reden: benutzt Events statt Polling. ;-)

(Kurz vergewissert -- ja, ich bin hier richtig, der Ausgangspunkt der 
Polling-Diskussion war dieser:

  Beitrag "Re: Welches Tool um einfaches Programm zu erstellen?"

Seit diesem Beitrag versuchen mir einige Menschen zu erklären, daß 
Polling in Wirklichkeit doch irgendwie knorke sei.)

von Heinz (Gast) (Gast)


Lesenswert?

Das, was hier alles geschrieben wurde, ist ja alles
gut und schön. Aber bleiben wir doch mal auf dem
Boden der Tatsachen.

Was macht denn ein laufendes Windowsprogramm ?
Es wartet die meiste Zeit auf Ereignisse. Sei
es, daß ein Button gedrückt wird, eine Liste
gescrollt, Dateiauswahl usw. Die Infos bezieht
es aus der Message-Queue, die zyklisch abgefragt
wird. Und auf die für das Programm interessanten
Ereignisse wird dann reagiert. Ob da nun auch
noch systemrelevante Dinge, wie etwa Dateiänderung
u.ä. zusätzlich abgefragt werden, merken wir zeitmäßig
i.d.R. gar nicht.

Ob das Abfragen betriebssystemintern über Polling
oder Zeitscheiben geschieht, kann man sowieso nicht
beeinflussen. Es ist ja so ausgelegt, daß normalerweise
keine Ereignisse verloren gehen.

Man kann sowas ganz gut verfolgen, wenn man einen
Timer ins Programm einbaut. Wählt man das Timerereignis
unter 300 MS, merkt man, daß sich das Programm immer
schwerer bedienen läßt. Da werden dann tatsächlich
Klick-Ereignisse verschluckt. Bei solchen Fällen
ist es immer ratsam, einen Thread statt Timer zu verwenden.

von Bernd K. (prof7bit)


Lesenswert?

Heinz (Gast) schrieb:
> Man kann sowas ganz gut verfolgen, wenn man einen
> Timer ins Programm einbaut. Wählt man das Timerereignis
> unter 300 MS, merkt man, daß sich das Programm immer
> schwerer bedienen läßt. Da werden dann tatsächlich
> Klick-Ereignisse verschluckt.

Was für ein kaputtes GUI-Toolkit benutzt Du denn?

: Bearbeitet durch User
von U.G. L. (dlchnr)


Lesenswert?

Ich habe mehrere solche Applikationen (PC mit serieller Schnittstelle 
kommuniziert mit Embedded System, http://ultronics.de/all/wxW1.jpg , 
http://ultronics.de/all/sw/EprRd1702A_2.png) mit wxWidgets und 
VisualStudio bzw. Codelite/TDM-GCC (würde also auch mit GCC unter Linux 
funktionieren) gelöst - da ich den ROM/EPROM-Reader eh veröffentlichen 
wollte (bislang fehlt mir dafür die detailierte Dokumentation :-) kann 
ich Dir gegebenenfalls den Sourcecode dafür überlassen. Für die 
Kommunikation verwende ich immer Boost.Asio, so dass also Boost 
vorhanden sein muss.

Selber würde ich allerdings mein nächstes derartiges Projekt mit 
Qt/TDM-GCC lösen.

: Bearbeitet durch User
von Retro N. (retronerd)


Lesenswert?

Ein einfaches Tool, das Dir die meiste Arbeit für GUI und Serial-Port 
uvm. schon abnimmt, ist z.B. Purebasic.

Durch Verwendung umfangreicher Libraries kann man sich auf die 
eigentliche Aufgabe konzentrieren, und das ganze Programm wird nur 
wenige Zeilen gross. Code Beispiele sind in PB inbegriffen. PB erzeugt 
kleine .exe Files, die in der Performance mit C/C++ Programmen 
vergleichbar sind. Läuft unter Windows, Linux und MacOS.

Ein komplett konfigurierbares Demo-Terminalprogramm im Source findest Du 
z.B. hier http://www.purebasic.fr/english/viewtopic.php?t=30372

Wenn Du aber Windows von Grund auf verstehen und in C/C++ programmieren 
möchtest, solltest Du Dir entweder Visual Studio 
https://www.visualstudio.com/de/vs/community/ und die MFC anschauen,
oder etwas kompakter mit reinem C z.B. PellesC (Instant IDE auf Basis 
lcc32) http://www.christian-heffner.de/ und Win-API. C/C++ dürfte vom 
Ergebnis deutlich sinnvoller sein, wenn Du langfristig ernsthaft 
programmieren willst, erfordert aber auch erheblich mehr Einarbeitung.

Wenn Du was fertiges suchst, lohnt vielleicht auch ein Blick auf
https://sourceforge.net/projects/scriptcommunicator/files/
https://www.hw-group.com/products/hercules/index_de.html
https://sites.google.com/site/terminalbpp/

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.