Gleichen Threadcode mehrmals gleichzeitig starten ?



  • Hallo,

    ich habe einen Thread, der mit AfxBeginThread mehrmals gestartet wird (gleichzeitig).
    Dabei wird das Programm auf einmal sehr langsam und die CPU ist zu 100% belegt.

    Ist das überhaupt möglich, den Thread mehrmals zu starten ?

    UINT WINAPI Thread(LPVOID param)
    {
    	int value=*((int*)param);
    	while(threadcontrol.globalshutdown==false)
    	{
            Sleep(10);
            }
    	return 0;
    }
    

    Wenn nicht, gäbe es eine Möglichkeit durch dynamische Klassengenerierung ?

    Grüße
    thenoname



  • Wenn du Workerthreads einsetzt werden sie mit der vollen Leistung laufen die sie bekommen können sofern das von dem System nicht limitiert wird. Lässt du jetzt mehrere laufen teilen sie sich nicht die Leistung A so das alle nur einen Teil der Leistung bekommen sondern alle laufen mit voller und gleicher Leistung .. also jeder mit 100%.

    Wenn ein Thread nicht mit voller Leistung laufen soll, kann man ihn durch eine bremse verlangsamen damit er weniger durchläufe in der sekunde macht.



  • Gibt es einen Unterschied zwischen AfxBeginThread und einem normalen Thread ??

    Wenn ich das Sleep wegnehme, kann ich nicht mal den Mauszeiger bewegen, das ist bestimmt nicht so gewollt von MS ? Oder ?


  • Mod

    Hast Du etwa eine hohe Thread-Priority verwendet?
    Dann wundert mich das nicht...

    PS: Es liegt wie immer nicht an Microsoft, die irgendwas nicht so gewollt haben sondern an dem programmierer, der den Code schreib... 😉



  • Vom Grunde her ist Microsoft natürlich immer fein raus 😉

    AfxBeginThread((AFX_THREADPROC)&Thread,(LPVOID)&z,THREAD_PRIORITY_NORMAL);
    

    Ich merke halt, das die Threads (19 insgesammt) so allen Lebenswillen aus Windows
    herausziehen. Sollte da das Betriebssystem nicht für sich selbst Zeit sichern ?
    Ich baue gerade einige Messagepumpen ein, aber ich finde es trotzdem merkwürdig.


  • Mod

    Wieso?
    Wenn alle 19 Threads niemals pausieren wundert mich das nicht. Jeder beansprucht sein volles Quota und macht nicht einen Tick I/O Pause. Da wundert mich nichts.



  • Wie errechnet man das genau ?



  • ?? ich habe mal 380 thread offen, wobei nur 30-50 gleichzeit rechenzeit hattenund dieanderen warteten. das system lief mit 45%.

    dachte auch immer das die rechenleistung schön aufgeteilt wird, ist aber nich unbedingt so, wenn ein thread

    while(1);
    

    hat wird da die gesamte rechenzeitinvestiert.. 100% systemlast



  • Siehe auch FAQ.
    Mach im Thread mal ein

    Sleep(0)

    bewirkt Wunder



  • Sleep(0) ist böse, und vor allem fast immer unnötig (weil sich sogut wie alles besser lösen lässt) 😉



  • Unterschiede:

    CreateThread: Win32-API-Funktion zum starten eines neuen Threads
    _beginthread, _beginthreadex: startet einen neuen thread, und initialisiert die C-Laufzeitbibliotheken für diesem Thread.
    AfxbeginThread: started neuen Thread und initialisiert MFC-Bibliotheken (sowie C-Laufzeit) für diesen Thread.

    Also:
    Wenn der Thread MFC-Funktionalität verwendet, AfxbeginThread.
    Wenn der Thread Funktionalität der C-Laufzeit verwendet, _beginthread(ex)
    Sonst "reicht" CreateThread.

    Setz' deine threads mal auf THREAD_PRIORITY_BELOW_NORMAL. - dann sollte der Lebenswille zurückkommen. Wie sieht deine Einstellung System/Advanced/Performance/Scheduling: "Programs" oder "Background Services"? (hab hier leider nur ein englisches System...)

    Stark vereinfacht gilt: der Thread mit der höchsten Priorität bekommt alle CPU-Zeit eines CPU-Kerns, bis entweder sein Zeitintervalll vorbei ist, oder der Thread dieses selbst aufgibt. Ist er danach immer noch der am höchsten priorisierte, ist er aber wieder dran.

    Bei gleicher Priorität sichert der Scheduler nur zu "fair zu allen threads zu sein".

    Generell also: Threads, die städnig etwas zu tun haben, mit niedriger Priorität laufen lassen, Threads, die hohe Priorität benötigen nur kurzzeitig arbeiten lassen.


Anmelden zum Antworten