Filou Geschrieben 14. April 2005 Geschrieben 14. April 2005 Hallo! Kann mir jemand für einen Anfänger verständlich und in deutsch beibringen, wie ich einen Thread programmiere?Der dann später mal Dateien kopieren, ohne dass das ganze system stehen bleibt Das währe wirklich super toll LG, Filou Zitieren
perdian Geschrieben 14. April 2005 Geschrieben 14. April 2005 Hier: http://www.google.com/search?hl=de&ie=ISO-8859-1&q=einführung+c%2B%2B+threads Zitieren
Ganymed Geschrieben 14. April 2005 Geschrieben 14. April 2005 Hier: http://www.google.com/search?hl=de&ie=ISO-8859-1&q=einführung+c%2B%2B+threads Perdi, es wäre nett, wenn du nicht ständig nur google-Links setzt. :hells: Zitieren
JohnJagger Geschrieben 14. April 2005 Geschrieben 14. April 2005 Wobei wir dann (wieder einmal) bei der Diskussion "vernünftige Fragestellung" wären... "verständlich und in deutsch beibringen" ...wurde bisher nur mit anderssprachigen Mitmenschen darüber geredet...?! "wie ich einen Thread programmiere?Der dann später mal Dateien kopieren, ohne dass das ganze system stehen bleibt" ...das könnte man noch präzisieren oder? Welches System bleibt stehen und was genau ist damit gemeint? Irgendwie höre ich vertraute Stimmen... Außerdem sind die ersten hits, die google bei der Suche von perdi bringt gar nicht mal soo übel !! Zitieren
perdian Geschrieben 14. April 2005 Geschrieben 14. April 2005 Perdi, es wäre nett, wenn du nicht ständig nur google-Links setzt.Es wäre genauso nett, wenn so manch ein Fragesteller verständlich zum Ausdruck bringt, was er denn überhaupt möchte (siehe auch Posting von JohnJagger). Es geht in keinster Weise aus dem Urpsrungsposting hervor, wieviel Ahnung überhaupt von Programmierung beim Fragesteller vorhanden ist - was heisst also "Thread programmieren" in diesem Zusammenhang? Ich kann mich durchaus irren, aber die Formulierung "für einen Anfänger verständlich und in deutsch beibringen" weckt bei mir sehr stark die Assoziation zu "ich habe nicht wirklich Ahnung und auch nicht wirklich Lust dazu, mir neues Wissen anzueignen, wenn es länger als 10 Minuten dauert". Aber davon ganz abgesehen: Was spricht dagegen einen Google-Link zu posten, wenn die Such-Resultate sowas von offensichtlich weiterhelfen, dass der Fragesteller sie auch mit praktisch keiner Mühe selber gefunden hätte? Es steht dir wiederrum frei, diesen Link einfach zu ignorieren. Zitieren
JohnJagger Geschrieben 14. April 2005 Geschrieben 14. April 2005 Vorschlag: lasst uns nicht schon wieder in diese Diskussion verfallen! Warten wir ab was Filou meint...vielleicht haben die google-Ergebnisse ja weitergeholfen, ansonsten bekommen wir bestimmt eine Präzisierung der Fragestellung und etwas mehr persönlichen Programmier-Background. *mitdemzaunpfahlwink* Zitieren
Filou Geschrieben 14. April 2005 Autor Geschrieben 14. April 2005 Wobei wir dann (wieder einmal) bei der Diskussion "vernünftige Fragestellung" wären... "verständlich und in deutsch beibringen" ...wurde bisher nur mit anderssprachigen Mitmenschen darüber geredet...?! "wie ich einen Thread programmiere?Der dann später mal Dateien kopieren, ohne dass das ganze system stehen bleibt" ...das könnte man noch präzisieren oder? Welches System bleibt stehen und was genau ist damit gemeint? Irgendwie höre ich vertraute Stimmen... Außerdem sind die ersten hits, die google bei der Suche von perdi bringt gar nicht mal soo übel !! Also ich habe bisher nur englische Hilfe in Forum gefunden. Und die meisten Leute haben nix erklärt nur irgendeinen Code gepostet der nicht funktioniert, wenn ichs in mein programm kopiere. Ich habe eine Funktion geschrieben, die Dateien von A nach B kopiert. Und eine schöne Bildlaufleiste als Animation gemacht, die Zeigt, dass der PC noch am schaffen ist. Und diese Leiste bleibt sehen, wenn ich kopiere, weil das System ausgelastet ist. Also wollte ich das kopieren in einem eigenen Thread machen.... Und ich fände es schön, wenn man mir auch ein bissel was dazu erklären könnte. Das hier hab ich z.B. bekommen: DWORD dwThreadId; HANDLE hThread; hThread = CreateThread( NULL, // default security attributes 0, // use default stack size ThreadFunc, // thread function NULL, // argument to thread function 0, // use default creation flags &dwThreadId); // returns the thread identifier Kann damit nix anfangen. Wie bekomme ich da meine Kopieren Funkion rein? Zitieren
Bubble Geschrieben 14. April 2005 Geschrieben 14. April 2005 Kann damit nix anfangen. Wie bekomme ich da meine Kopieren Funkion rein? ThreadFunc ist der Zeiger auf die Eintrittsfunktion (Adresse) des Threads. Dort beginnt die Ausführung Deines Threads. Die Funktion muss so aussehen: DWORD WINAPI ThreadFunc(LPVOID parameter); Mehr findest Du in der MSDN unter "CreateThread" und "ThreadProc". Dort ist auch ein Link zu einem Beispiel. Zitieren
perdian Geschrieben 14. April 2005 Geschrieben 14. April 2005 Und die meisten Leute haben nix erklärt nur irgendeinen Code gepostet der nicht funktioniert, wenn ichs in mein programm kopiere.Naja du wirst generell bei Beispiel-Code, der gepostet wird immer Anpassungen vornehmen müssen, damit er in deinem speziellen Fall funktioniert. Und diese Leiste bleibt sehen, wenn ich kopiere, weil das System ausgelastet ist. Also wollte ich das kopieren in einem eigenen Thread machen....Wenn das System ausgelastet ist, wird dir auch ein neuer Thread nichts mehr bringen, der würde dann ja auch nicht zur Ausführung kommen. Was wohl eher der Fall sein dürfte ist, dass du die Berechnung im EvenDispatcher Thread abarbeitest. Das heisst in dem Thread, der das Zeichnen auf dem Bildschirm übernimmt. Dadurch blockierst du dann mit deiner Copy-Operation das Zeichnen des Fensters (oder eines Controls) und es wird erst wieder gezeichnet, wenn du mit dem Kopieren fertig bist. Aber ein eigener Thread ist trotzdem die Lösung des Problems. Und ich fände es schön, wenn man mir auch ein bissel was dazu erklären könnte.Was ist dir denn genau noch unklar? Du musst über ThreadFunc einen Pointer auf die Funktion übergeben, die von dem neuen Thread aufgerufen werden soll, und die dann die Arbeit erledigt. Zitieren
Filou Geschrieben 14. April 2005 Autor Geschrieben 14. April 2005 Sorry, Ich kapiere es immer noch nicht. *schäm* hThread = CreateThread(NULL,0,ThreadFunc,NULL,0,&dwThreadId); Was ist dann die ThreadFunc und für was brauche ich die ThreadId? Könnt ihr mal von vorne anfangen zu erklären? Stellt euch vor, ihr erklärt es euerer Mutter Ich hab ungefähr genausoviel Ahnung! Und selbst wenn ich das dann habe, was da oben steht, wie starte ich dann eine Funktion in dem Therad? mit ThreadId->kopieren(); oder so???? Zitieren
perdian Geschrieben 14. April 2005 Geschrieben 14. April 2005 Ich hab ungefähr genausoviel Ahnung!Dann solltest du dich zunächst mal mit den Grundlagen von C(++) beschäftigen. Wenn du nicht weisst, was ein Funktionszeiger ist bringt es auch nichts an Threads gehen zu wollen. Und das Thema ist mal nicht eben in einem Posting hier erklärt - da brauchst du schon eine Weile um dich da einzulesen. Am besten schnappst du dir ein gutes C-Tutorial und fängst da an zu stöbern, wahrscheinlich gibt's dann da auch ein Kapitel über Threads drin. Zitieren
Filou Geschrieben 14. April 2005 Autor Geschrieben 14. April 2005 also ich habe schon viele c++ anwendungen gemacht meistens mfc. auch größere sachen an denen ich mal ein halbes jahr gesessen habe. hab mir alles selber beigebracht. nur um zeiger habe ich mich immer gedrückt. das wollte nie in mein kopf. wenn ich mal einen gebraucht hätte, habe ich es meistens mit globalen variablen oder so umgangen. aber das mit den thread wüsste ich schon echt gerne.... Zitieren
Bubble Geschrieben 14. April 2005 Geschrieben 14. April 2005 Für CreateThread brauchst Du keine C++ Kentnisse, reines C genügt. Beispiel einer Funktion: void SagHallo() { printf("Hallo!\n"); } Du Rufst die Funktion mit SagHallo(); auf. Andererseits ist SagHallo auch eine Variable, die einen Zeiger auf die Startadresse Der Funktion SagHallo im Speicher enthält. Du kannst Diesen Zeiger dann als Parameter an eine Andere Funktion übergeben und sie so die übergebene Funktion aufrufen lassen. Ein Beispiel für die Übergabe von Funktionszeigern ist qsort aus der C-Library. Genauso machst Du das mit Deinen Threads. Zuerst schriebst Du die Thread-Funktion, die das enthält, was Dein Thread ausführen soll. Beispiel: #include <windows.h> #include <stdio.h> DWORD WINAPI MyThreadSagWasAndauernd(LPVOID parameter) { // parameter wird in diesem Beispiel nicht genutzt while(true) { printf("was...\n"); Sleep(1000); } } (Achtung: Im Beispiel ist eine Endlosschleife, in der Praxis solltest Du Dir etwas überlegen, wie Du den Thread sauber beenden kannst!) Nun kommt das Hauptprogramm. Es startet einen neuen Thread und arbeitet dannach selbstständig weiter: int main() { // Starte einen Thread: CreateThread(NULL, 0, MyThreadSagWasAndauernd, NULL, 0, NULL); // Kurz warten... Sleep(500); // Und noch eine Endlosschleife: while(true) { printf("anderes...\n"); Sleep(1000); } } Ausgabe des Beispiels ist: was... anders... was... anders... ...usw.... Probier das Beispiel aus, es funktioniert. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.