Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Windows » Hilfe! lange Berechnungen blockieren System

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.04.2005, 20:15 Uhr
gerspeece



Hi Leute,

ich habe ein rechenintensives programm geschrieben, die berechnungen dauern etwa 3 minuten, während dieser zeit lässt sich das Programmfenster nicht mal bewegen, geschweige denn können andere programme parallel arbeiten.
das programm blockiert während seiner rechenphase alles andere!
ich habe die berechnung in der funktion OnInitDialog() aufgerufen...falscher Ort?
ich brauche mal hilfe von nem erfahrenen programmierer.
meine ideen zu dem problem sind folgende:

1. man könnte den rechenvorgang in kleine überschaubare einheiten teilen und jeweils nach abarbeitung einer einheit schickt das programm sich selbst eine nachricht die es veranlasst an der nächsten einheit weiterzurechen. so haben andere messages die chance dazwischen aktiv zu werden

2. die funktion OnIdle() wird wohl regelmässig aufgerufen, vielleicht macht man sowas auch mit einer solchen konstruktion?

3. ich habe auch schon davon gehört „threads im hintergrund“ laufen zu lassen, leider habe ich keinerlei info darüber

kann mir irgendjemand einen tip geben, wie man sowas üblicherweise macht?
LG
Gregor
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.04.2005, 20:52 Uhr
Spacelord
Hoffnungsloser Fall


Mit einem Thread könntest du dafür sorgen dass sich dein Fenster bewegen lässt während die Berechnung läuft.
Auf andere Prozesse sollte deine Anwendung,sofern du eine normale Priorität gewählt hast, überhaupt keinen Einfluss haben.
Deinem Prozess wird vom Scheduler seine Rechenzeit zugewiesen und mehr gibt es auch nicht.Deshalb sollten die anderen Prozesse eigentlich normal weiter laufen.
OnInitDialog ist sicherlich nicht die erste Wahl für deine Berechnung...


MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.04.2005, 21:49 Uhr
~CDW
Gast


threads machen mit WinAPI:
CreateThread

C++:
CreateThread
The CreateThread function creates a thread to execute within the address space of the calling process.

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // pointer to security attributes
  DWORD dwStackSize,                         // initial thread stack size
  LPTHREAD_START_ROUTINE lpStartAddress,     // pointer to thread function
  LPVOID lpParameter,                        // argument for new thread
  DWORD dwCreationFlags,                     // creation flags
  LPDWORD lpThreadId                         // pointer to receive thread ID
);



im Prinzip braucht man davon nur den Pointer zu der funktion und zur Thread ID
in der ThreadFunktion ruft man am ende ExitThread auf.
Wenn man den Thread nicht mehr braucht schließt man auch den Handle dazu:
CloseHandle,hThread (ich machs normalerweise in der Thread funktion).
je nach aufwand kann man auch verschiedene Synchronisierungsmechanismen einbauen um den Thread wenn nötig stoppen zu können.
Mal eine andere Frage: war für Berechnungen sind das? Eventuell lässt sich da ein gutes stückchen optimieren (vor allem am Algo).


Bearbeitung von Windalf:

tagfehler ausgemerzt...


Dieser Post wurde am 04.04.2005 um 00:13 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.04.2005, 08:32 Uhr
~gerspeece
Gast


danke für die hilfe! für den algorhythmus müssen vorher einige globale klassen initialisiert sein und ich weiss leider nicht, ob die schon initialiisert sind wenn ich das von InitInstance() aufrufe...wäre InitInstance() eine bessere Wahl? Oder gibts es noch mehr stellen an denen sowas passen würde. für die berechnung brauche ich ebenfalls einige daten von GetSystemMetrics() und muss einige Static-Controls in ihrer Grösse setzen, die wiederum create ich ja erst in OnInitDialog(), deswegen hatte ich die längere Berechnung dort eingefügt...ach es ist schon ein drama mit der verflixten mfc...
LG
gerspeece
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.04.2005, 08:33 Uhr
~gerspeece
Gast


schön dass man nicht allein ist mit seinen problemen... ich werde mich jetzt mal einen tag lang mit threads beschäftigen, AfxBeginThread() und dann ein worker-thread steht jetzt auf dem plan, werde mir dazu eine kleine applikation schreiben, mit der ich alles austesten kann, auch die kommunikation mit dem hauptthread und so. am algo habe ich schon viel rumgebastelt, der ist schon ziemlich optimal, was ich noch verbessern könnte, wäre ihn in assembler zu realisieren, aber das kostet zuviel zeit sich da reinzufuchsen und in assembler wäre es auch höchstens 30 % schneller, denn die c-routinen sind schon recht assembler-like programmiert.
was noch ungeklärt ist: es gibt soviele verschiedene möglichkeiten einen thread zu starten, welche nimmt man?
CreateThread, _beginThread, AfxBeginThread, oder ganz kompliziert: ne ableitung von CWinThread...
ich werde es zunächst mit AfxBeginThread versuchen, vielleicht ist es auch egal auf welche art...
LG
gerspeece
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.04.2005, 13:28 Uhr
~CDW
Gast


ich benutze zwar die Dinger nicht, aber es gibt sie: Profiler, damit kann man schauen wo genau es im Code hängt. Wenn das nicht so viel ist, biete ich mich ja an, die Rechen-Routinen in asm zu schreiben und entweder als inline-asm oder Extra-DLL, OBJ usw (alles was MASM hergibt). zur verfügung zu stellen.
mit
Zitat:

Eventuell lässt sich da ein gutes stückchen optimieren (vor allem am Algo).

meinte ich dass du deinen Algo hier posten könntest (falls es natürlich geht) und dann ein paar Leute mal drüber schauen könnten - manchmal sieht man ja den Wald vor lauter Bäumen nicht .
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.04.2005, 17:52 Uhr
~gerspeece
Gast


vielen dank für die hilfe, der algo ist so überschaubar, dass man wirklich sagen kann, dass er schon optimal ist, es ist im prinzip nur ein flexibles zahlensystem, dass runtergezählt wird (also jede ziffer hat eine individuelle basis) dies entspricht einer konstellation, die nach 5 kriterien bewertet wird, wobei man die prioritäten setzen kann, am schluss kommt eine bestbewertete lösung heraus, manchmal gibt es auch gleichwertige lösungen aber da ist´s egal welche davon genommen wird.
ich habe auch schon drüber nachgedacht, ob ich das ganze lieber im team realisiere, aber dazu müsste ich jemanden treffen, der die mir fehlenden fähigkeiten hat und eine vorliebe für musikprogramme teilt... dazu müsste ich den auch noch persönlich kennen, mögen und er müsste in der selben stadt wohnen...zu unwahrscheinlich, also werde ich das programm alleine schreiben.
LG
gerspeece
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.08.2005, 16:18 Uhr
~Flapsi01
Gast


Das Problem, dass Dein Programm bei langen Berechnungen alles blockiert löst Du am besten mit einer "Message Pump". Diese sorgt dafür, das Windows selbst bei starker Auslastung durch Dein Programm noch Nachrichten, wie Fenster verschieben o.ä. absetzen und bearbeiten kann.


C++:
BOOL PeekandPump(){
    MSG msg;
    while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){
        if(!AfxGetApp()->PumpMessage()){
            ::PostQuitMessage(0);
            return FALSE;
        }
    }
    LONG IIdle=0;
    while(AfxGetApp()->OnIdle(IIdle++));
    return TRUE;
}



Beste Grüße

Flapsi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Windows ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: