OOP Grundaufbau
-
ohjeohje schrieb:
Woher kommt der Quatsch eigentlich immer? Multitasking/threading wird auf Systemen mit nur einem Kern sowieso nur vom OS vorgetäuscht. Die Ideen davon kann man überall in beliebiger Komplexität anwenden. Meistens reicht schon eine simple nicht blockiernde Abfrage der Usereingaben, um eine vernünftig bedienbare grafische Oberfläche zu bauen.
Ähm, auch auf nem Multicore-System hast du gute Chancen, dass das OS für eine Multithreaded-Anwendung nur einen Kern verwendet. Lass doch einfach das OS entscheiden, das wird schon wissen was es tut.
So wie es scheint hast du selber noch keine Gui-Anwendung mit rechenintensiver Datenbeschaffung erstellt. Dann wüsstest du dass multithread/multiprocess die einzige bequeme Art sind das Problem zu lösen. Sicher kannst du dir deinen eigenen Scheduler schreiben, der abwechselnd der Gui und dem Rechenteil ausführen lässt. Oder zumindest ein eigenes Design für den Rechenpart, der Die Berechnung stückweise erledigen kann, damit man auch anderen Teilen Rechenzeit geben kann. Aber das wird nie so effizient werden wie das was dir dein OS an die Hand gibt, und außerdem wird es mit dem Wachsen des Programms immer komplizierter und unübersichtlicher. Lass einfach mal noch weitere "Threads" für neue Berechnungen dazu kommen.
Und wenn es doof läuft hast du doch irgendwo wieder eine komplette Blockierung drinnen.
YEAH Baby, Shagadelic!
-
Ich habe ja jetzt zum experimentieren eine Windows Forms Anwendung erstellt. Anscheinend basiert das ganze auf .NET. Ist das für meine Zwecke ausreichend, oder sollte ich mich lieber mit MFC beschäftigen. Ich finde das Windows Forms eigentlich ganz praktisch, da dort schon viel integriert ist, wie zum Beispiel einfacher zugriff auf die Serielle Schnittstelle.
-
l'abra d'or schrieb:
ohjeohje schrieb:
Woher kommt der Quatsch eigentlich immer? Multitasking/threading wird auf Systemen mit nur einem Kern sowieso nur vom OS vorgetäuscht. Die Ideen davon kann man überall in beliebiger Komplexität anwenden. Meistens reicht schon eine simple nicht blockiernde Abfrage der Usereingaben, um eine vernünftig bedienbare grafische Oberfläche zu bauen.
Ähm, auch auf nem Multicore-System hast du gute Chancen, dass das OS für eine Multithreaded-Anwendung nur einen Kern verwendet. Lass doch einfach das OS entscheiden, das wird schon wissen was es tut.
So wie es scheint hast du selber noch keine Gui-Anwendung mit rechenintensiver Datenbeschaffung erstellt. Dann wüsstest du dass multithread/multiprocess die einzige bequeme Art sind das Problem zu lösen. Sicher kannst du dir deinen eigenen Scheduler schreiben, der abwechselnd der Gui und dem Rechenteil ausführen lässt. Oder zumindest ein eigenes Design für den Rechenpart, der Die Berechnung stückweise erledigen kann, damit man auch anderen Teilen Rechenzeit geben kann. Aber das wird nie so effizient werden wie das was dir dein OS an die Hand gibt, und außerdem wird es mit dem Wachsen des Programms immer komplizierter und unübersichtlicher. Lass einfach mal noch weitere "Threads" für neue Berechnungen dazu kommen.
Und wenn es doof läuft hast du doch irgendwo wieder eine komplette Blockierung drinnen.
YEAH Baby, Shagadelic!
-
ohjeohje schrieb:
Was du geschrieben hast hab ich verstanden. Aber deiner Antwort zu entnehmen hast du etwas anderes gemeint...
-
SeppJ behauptet: Man braucht A um Z zu machen.
ohjeohje sagt: Man braucht A nicht um Z zu machen.
ohjeohje sagt damit nicht: Man darf A nicht verwenden um Z zu machen.
ohjeohje sagt damit auch nicht: Man muss A selber machen um Z zu machen.Und zu
l'abra d'or schrieb:
So wie es scheint hast du selber noch keine Gui-Anwendung mit rechenintensiver Datenbeschaffung erstellt.
Meine erste Windowsanwendung, die ich vor über 10 Jahren geschrieben hab, war ein kleines Programm zum Verschlüsseln von Dateien. Schön mit nen Dialog mit Statusanzeige und Cancel-Button, der natürlich auch funktioniert. Alles ganz ohne Threads, nur mit Timer. Da muss man sich nicht mal darum kümmern, ob man den Statusupdate synchronisieren muss, damit die GUI nicht irgendwelchen Müll anzeigt, weil es keinen parallelen Zugriff auf Daten gibt. Und auch aus dieser Aussage folgt jetzt nicht, dass das jetzt jeder so machen muss.
-
ohjeohje schrieb:
Alles ganz ohne Threads, nur mit Timer.
Hmm, wie kommst du an das passende TimerInterval? Wartest du zu lange und gibst dem Rechnenden Thread zu wenig Zeit ist die Verschlüsselung inperformant. Andersrum ist der "Thread" vllt. schon fertig, aber der Timer hat noch nicht ausgelöst und alles wartet auf das TimerEvent.
Und auch wenn du für dich die passenden Einstellungen findest, ist der Rechner des Users vllt. schneller oder langsamer.Es gibt sicherlich viele Möglichkeiten Threads zu umgehen. Aber keine wird so effizient sein wie Entscheidungen über Rechenzeit an das OS auszulagern.
Ich hoffe da kannst du wenigstens zustimmen.Thread-Synchronisation ist natürlich ein anderes Thema. Da kann man einiges falsch machen. Und Threads sind sicher nicht immer die beste Lösung.
-
l'abra d'or schrieb:
ohjeohje schrieb:
Alles ganz ohne Threads, nur mit Timer.
Hmm, wie kommst du an das passende TimerInterval? Wartest du zu lange und gibst dem Rechnenden Thread zu wenig Zeit ist die Verschlüsselung inperformant. Andersrum ist der "Thread" vllt. schon fertig, aber der Timer hat noch nicht ausgelöst und alles wartet auf das TimerEvent.
Wahrscheinlich macht er es mit einem einzigen Thread und löst einen Timer aus. In der Message-Loop arbeitet er immer alle GUI-Events ab, auch das Timer-Event. Beim Timer-Event macht er immer einen Teil der Berechnung und gibt dann wieder Zeit dem GUI ab, bis das nächste Timer-Event kommt.
Nicht gerade sehr effizient, aber funktioniert
Und man kann auch effiziente GUI Anwendungen mit nur einem Thread schreiben, sofern man nie grössere Arbeiten erledigen muss, was ich durchaus auch schon öfters erlebt habe.Multitasking/threading ist definitiv nicht unbedingt nötig.
Grüssli
-
Gibt es irgendwo Beispiele für ein gutes Konsolen Menü? Und wie könnte ich das denn nun am besten machen, das trotz Menü immer Daten von der Seriellen Schnittstelle geholt und verarbeitet werden?
-
Markus W. schrieb:
Und wie könnte ich das denn nun am besten machen, das trotz Menü immer Daten von der Seriellen Schnittstelle geholt und verarbeitet werden?
Das wird vermutlich nur mit Threads gehn, weil die input-Funktionen blockieren, d.h. das Programm wartet bis der Input da ist und macht nebenbei nichts anderes.
-
Gut also brauche ich Threads. Da muss ich mir mal die Boost Library ansehen. Wie sieht es mit Menücodes aus? Gibt es da irgendwo Samples? Weil ich finde es ist recht aufwendig in der Konsole ein gescheites Menü zu erstellen.
-
Markus W. schrieb:
Gut also brauche ich Threads. Da muss ich mir mal die Boost Library ansehen. Wie sieht es mit Menücodes aus? Gibt es da irgendwo Samples? Weil ich finde es ist recht aufwendig in der Konsole ein gescheites Menü zu erstellen.
Mit NCurses kann man wunderschöne TUIs basteln. Für Windows kannst du dir PDCurses anschauen, wobei es da sicher auch was eigenes gibt.
Ansonsten ist so ein Menü doch gleich selber geschrieben. Oder wo hängt es bei dir im Moment genau?
-
Also ich hab mir erst einmal 2 Grundsätzliche Sachen überlegt für Menüs. Einmal verschachtelte Ifs. Oder Zentrales If mit einer Menüvariable. Je nach Menüvariable wird ein Entsprechendes Menü aufgerufen. Und mit cin wird die Menüvariable eingelesen. Das ist ja noch ganz gut zu erweitern. Bei den verschachtelten wird es schnell unübersichtlich. Aber selbst wenn ich jetzt einen Menü Punkt einfügen muss muss man ja immer alles mögliche ändern.