Multitasking in einer Konsolenanwendung?



  • Hallo, ich habe funktion a() und funktion b(). nun will ich, dass sie jeweils in einem 5 millisekundentakt jeweils ausgeführt werden und dabei nicht auf ein return gewartet wird, sondenr sie sollen 5 ms ausgeführt werde, dann die andere funktion und dann soll die funktion wieder da beginnen, so sie stehen geblieben ist...

    ist das irgendwie möglich?

    wenn nicht, kann man dann zwei konsolenanwendungen parralell laufen lassen, sodass sie ein uns dieselbe variablen mit der jeweiligen gleichn anddresse bearbeiten? programm a könnte daten manipulieren und abspeichern und programm b diese aus dem RAM aufrufen und weiterverarbeiten?

    ganz wichtig ist, dass die funktionen gleichzeitig laufen und auf gemeinsame daten zugreifen können! 😞

    Danke um hilfe,
    garry :p 🙂



  • 2 threads - den ersten mit funktion a() an belieber stelle blockieren den zweiten mit funktion b() weitermachen lassen, irgendwann diesen wiederum blockieren und thread 1 freigeben^^ (erster absatz ;))
    beim parallelen ablauf müsste gewährleistet sein, dass thread 2 keine inkonsistenten daten lesen kann...
    deine beschreibung hört sich ziemlich konfus an - was willste eigentlich machen? 🤡



  • Also zwei Konsolenanwendungen miteinander kommunizieren lassen, dürfte schwer werden. Denn da du ja vermutlich meinst dass erst eine gestartet wird und dann die andere, würden die beiden vom Betriebssystem zwei unterschiedliche Speicherbereiche zugewiesen bekommen. D.h. eine Kommunikation wäre da meiner Meinung nach nur über Dateien möglich.

    Wenn du Kommunikation willst, dann musste mit Threads arbeiten.

    Wenn du mal grob sagst was du machen willst, ist dir vielleicht noch zu helfen 😉



  • Naja, es muss nicht unbedingt ein Thread sein. Es gibt auch noch Prozesse und Pipes. Allerdings ist die Matherie etwas komplizierter. Denn ein Thread ist (salop gesagt) ja ein "Prozess-Light".
    Aber was jetzt das richtige ist kann man wirklich nur sagen wenn man das genaue Anwendungsgebiet kennt.



  • hola

    mit OS funktionalitaet waere es moeglich. unter windows gibt es sogenannte fibers.
    mit sowas kannst du dir dein eigenes thread-management zusammenbauen. wie es unter linux aussieht entzieht sich meiner kenntnis.

    Meep Meep



  • Zwei Prozesse miteinander kommunizieren lassen könnte man auch relativ einfach über Sockets machen.



  • oder shared memory... 🙄



  • @garry_weber:

    Du benötigst 3 Threads. Einer der die Funktion a() ausführt, einer der die Funktion b() ausführt und einer der den Wechsel zwischen Thread 1 und Thread 2 steuert. Dieser Hauptthread zieht einen Timer auf und legt sich danach schlafen. Wenn nun der Timer nun klingelt, legt der Haupthread den aktiven Thread 1 schlafen (suspend) und aktiviert den zweiten Thread (resume). Danach zieht der Hauptthread wieder den Timer auf und legt sich wieder schlafen. Wenn nun der Timer nun klingelt, legt der Haupthread den aktiven Thread 2 schlafen und aktiviert den ersten Thread...

    Dazu benötigst du eine Bib mit erweiterte Thread-Unterstützung sowie einer Timer-Klasse, welche dir alle 5 ms ein Event schickt. Der Timer scheint es unter der Windows MFC in Form von CWnd::SetTimer() / CWnd::GetTimer() zu geben. Threads scheint es als CWinThread zu geben. Hundertprozentig sicher bin ich da nicht, da ich so etwas nur unter Java machen durfte.



  • ich forsche grade am symantischem web. ich bin grade dabei, eine routine zu schreiben, die "wortfelder" - also eine Tabelle an Wörtern, die sehr oft mit einem bestimmten Wort (Zentralwort der Tabelle) in einem (deutschen) Satz verwendet werden - errechnet. den allgorithmus und so habe ich auch schon und ließ es auf php und mysql laufen. der algorithmus klappt auch wunderbar - alles happy und tralala...

    ich habe jedoch festgestellt, dass es uneffektiv ist, da man

    a) nicht so viele textquellen und
    b) nicht so viel speicherpaltz

    hat. deswegen experementiere ich grade mit einem keylogger (in guter absicht). er ließt alle zeichen ein, die über die tastatur laufen, solange das zeichen nicht ein '.', '?', '!' ist. sollte es eintreten (also satzende), wird der gespeicherte satz an den auswertungsalgorithmus geschickt.
    es darf also nicht ein algorithmus sein, der im nachhinein ausgeführt wird, sondern er muss parallel laufen und muss irgendwie daten empfangen können, die dieser keylogger ihm sendet. das gesamte system muss auf dem heimischen PC im hindetergrund laufen und außer vielleicht der ressourcenfresserei (wenn es parall läuft, müsste es nicht viel kapazität fressen, da es immer häppchen bekommt) den benutzer nicht an seiner arbeit behindern...

    die daten, die das system kriegt, muss es auswerten können und auf dem lokalen pc abspeichern. wenn ein andere benutzer solch eine worttabelle benutzt und an das netzwerk drangebunden ist, kann er eine anfrage zum jeweilgen rechner senden und der sendet die daten ggf zurück. da der rechner die anfrage aber nicht an einem, sondenr an (hoffentlich irgendwann) 30.000 rechner schickt und diese ihm alle antworten, erhällt man dann sehr genau wortfelder, wenn man dann aus den identischen wortfeldern der 30.000 benutzer ein querschnitt zieht.

    ich will nicht, dass der puffer eine datei ist, da es zu prolemen führen kann, wenn man ließt und schreibt zu gleicher zeit (was sehr wahschrscheinlich ist)...

    die routine, die auswertet, soll einen speicherbereich haben, so sie daten (also aätze) rausnimmt um zu bearbeiten und wieder neue von keylogger nachschiebt.

    hab mich in
    Google: site:msdn.microsoft.com
    http://msdn.microsoft.com/en-us/library/aa365780(VS.85).aspx

    versucht einzulesen. ich denke das system verstehe ich. gut, es war heute morgen um 1:00 als ich das gemacht habe 😞
    es ist doch so, dass doch pipes so ähnlich wie shared memory ist? d.h. der kelogger hat die berechtigung dort zu schreiben und die auswertungsroutine hat das recht von dort zu lesen und es danach zu löschen? oder ist shared memory was anderes? 😕

    ich könnte es doch so konzipieren, dass wenn die auswerungsroutine eine satz abgearbeitet hat, in diesem speicherbereich anchguckt, ob was neues hinterlegt ist und es gegebenfalls aufnimmt?

    Garry



  • Shared memory ist im Endeffekt nichts anderes als eine gemeinsame Variable, welche von mehreren Threads benutzt wird. Dabei kann es zu Problemen kommen, wenn beispielsweise ein schreibender Thread durch einen lesenden Thread unterbrochen wird. Bsp: Der Thread Zeitungschreiber schreibt in eine gemeinsame String Resource Zeitung. Wird dieser während seiner Arbeit durch den Thread Zeitungsleser unterbrochen, liest dieser aus der String Resource Zeitung sowohl alte als auch neue Nachrichten ein. Zum Gau kommt es wenn der Thread diese Informationen (beispielsweise in Form von Börsengeschäften) weiterverarbeitet.

    Eine Pipe ist da eher ein weiterführendes Konzept. Anscheinend ist eine Pipe ein Objekt, wo ein Thread ein anderes Objekt hineinsteckt und der andere Thread daraufhin das Objekt als Nachricht bekommt. Deutlicher gesprochen, könnte man auch von einem Mini-Mini E-Mail System zwischen Threads sprechen. Probleme wie bei shared memory dürften bei sauberer Implementierung nicht auftreten, da die I/O Funktionen des Pipe Objektes atomar sein sollten.


Anmelden zum Antworten