Deutsch
Forum

nProc und Neuzeichnen - Messages

 
- Seite 1 -



E.T.
Eben so aufgefallen: Ist mein Xprofan-Programm im nProc am arbeiten, wird es z.B. durch "Neuzeichnen"  aus dem Tritt gebracht. "Neuzeichnen"  tritt ja immer auf, wenn das Prog-Fenster verkleinert, verdeckt oder verschoben wird (verdeckt z.B. durch Bildschirmschoner ).
Nach solch einem Event scheind meine nProc endlos damit beschäftigt zu sein, das Fenster neu zeichnen zu wollen. Und dies ewig, mit der Eieruhr für völlige Auslastung. Auch die Messages an die Balken-Anzeigen erzielen keinerlei Wirkung mehr. Selbst das System-Menü wird wirr, vor dem nProc habe ich z.B. das [X] für "Programm schließen" deaktiviert, dieses ist dann wieder aktiv.
Solange ich das Fenster nicht verdecke oder verschiebe, läuft das nProc klaglos durch, mit dem ganz normalen Pfeil als Mauszeiger....

Beispiel meiner nProc:
KompilierenMarkierenSeparieren
nProc Vergleichen

    global Liste1&,  Liste2&, Liste4&, Zaehler1&, Zaehler2&, Status&, ProgressBar_3&, ProgressBar_4&
    Declare Verg_Dat_1$, Verg_Dat_2$, Vergl_Str1$, Vergl_Str2$, Vergl_Pass&, Pos_L1&

    WhileLoop 0,Zaehler1&

        Vergl_Str1$ = GetText.Listview(Liste1&, &loop, 0)
        Verg_Dat_1$ = GetText.Listview(Liste1&, &loop, 1)

        WhileLoop 0,Zaehler2&

            Vergl_Str2$ = GetText.Listview(Liste2&, &loop, 0)

            If Vergl_Str1$ = Vergl_Str2$

                Verg_Dat_2$ = GetText.Listview(Liste2&, &loop, 1)

                IfNot Verg_Dat_1$ = Verg_Dat_2$

                    Inc Vergl_Pass&
                    AddString(Liste4&, Verg_Dat_1$ + "|" + Verg_Dat_2$)

                EndIF

            EndIf

            Sendmessage(ProgressBar_4&,$0400+2,int(100.0/Float(Zaehler1&)*Float(&loop)),0)

        EndWhile

        Sendmessage(ProgressBar_4&,$0400+2,0,0)
        Sendmessage(ProgressBar_3&,$0400+2,int(100.0/Float(Zaehler1&)*Float(&loop)),0)

    EndWhile

EndProc


Ist ja halt kein so komplizierter Code, lediglich das vergleichen vieler Strings auf Übereinstimmung (läuft halt doch als nProc vieeel schneller als in XProfan..)
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
12.11.2010  
 



 
- Seite 2 -


« Dieser Beitrag wurde als Lösung gekennzeichnet. »

- Seite 3 -


Geht doch wie im Beispiel*:
KompilierenMarkierenSeparieren
'URL: https://xprofan.com/intl/de/xpse/nproc-und-neuzeichnen-messages/#bottom
 {$cleq}
cls
long myThread=createThread(0,0,procAddr(eineProc),hWnd,0,0),b
print "fertig"

while 1

    waitinput 1000
    getExitCodeThread(myThread,addr(b))
    case b==123456 : break

wend

print "allesfertig"
end

nProc eineProc(long some)

    whileLoop 2

        setText(some,str$(getTickCount))
        sleep(1000)

    wend

    return 123456//oder exitThread(123456) wenn an beliebiger Stelle Thread abgewürgt werden soll wie "end 123456"

endProc


*XP-getestet - hab hier nur XP.
 
13.11.2010  
 




E.T.
Nun gut. Bleibt mir nur noch das Neuzeichnen aus dem nProc heraus.
Hab da keinen Plan, habs mit if thread.message(HDC)=wm_paint  probiert, geht nicht. Hab da bei dem Assembler-Zeugs soviel Ahnung wie vom Kinder-kriegen .
Kannst Du mir , bitte, wenn du Zeit und Lust hast, auf die Sprünge helfen ??
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
13.11.2010  
 



E.T. (13.11.10)
Nun gut. Bleibt mir nur noch das Neuzeichnen aus dem nProc heraus.


Ich meine dies wäre der falsche Weg! Grundsätzlich wäre dies halt ein Call auf die wndProc mit den 4 Params hWnd,wm_paint,0,0 ... und die wndProcAddr gibts ja per getWindowLong(hWnd,gwl_wndProc ... aber wie gesagt halte ich das für ne "falsche Lösung".

Was spricht denn dagegen das Du Deine Proc - die da halt "ewig" dauert - per CreateThread aufrufst statt "normal"?
 
13.11.2010  
 




E.T.
iF (13.11.10)
Was spricht denn dagegen das Du Deine Proc - die da halt "ewig" dauert - per CreateThread aufrufst statt "normal"?


Weil in dem Prog eh keiner was machen kann (soll), solange das Vergleichen läuft. Würde denn dann das HWND den Neuzeichnen-Befehl mitbekommen, wärend es auf den anderen Thread wartet (soryy, ich stell mich wohl etwas blöd an...)
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
13.11.2010  
 



E.T. (13.11.10)

iF (13.11.10)
Was spricht denn dagegen das Du Deine Proc - die da halt "ewig" dauert - per CreateThread aufrufst statt "normal"?


Weil in dem Prog eh keiner was machen kann (soll), solange das Vergleichen läuft.


So wie ich das verstanden habe stimmt dies aber nicht, denn es soll ja der UI-Thread neuzeichnen und nicht "nichts" tun. ^^

E.T. (13.11.10)
Würde denn dann das HWND den Neuzeichnen-Befehl mitbekommen, wärend es auf den anderen Thread wartet (soryy, ich stell mich wohl etwas blöd an...)


Denkst vlt. nur zu kompliziert. Du hast momentan halt 1 Thread und möchtest aber das dieser 2 Dinge "zugleich" tut - was "natürlich" nicht der Fall ist. ^^
 
13.11.2010  
 



Wart ich fummel Dir was... <-- ließt ja zum Glück keiner...
 
13.11.2010  
 



Schau mal ob Dir sowas hilft...
KompilierenMarkierenSeparieren oder sowas... (poste ich gleich...)
 
13.11.2010  
 



Echten Thread "unendlich" lange ackern lassen ohne UI-Thread zu "blockieren":
KompilierenMarkierenSeparieren
So kannst doch einfach "Aufgaben"/ Threads anweisen und die werden lecker im Hintergrund abgearbeitet ohne das Du Dich kümmern müsstest... (nProcs sind doch threadsicher ^^)
 
13.11.2010  
 




E.T.
Super, das erstere sieht für mich so aus, als würde es machen, was ich suche.

Muss ich doch gleich die anderen Sachen ruhen lassen und einbauen und testen (und derweil wieder was über Call's und ProcAddr in Assembler lernen) ...

Auf jeden Fall schon mal ein großes DANKE für Deine Mühe!!!
Und wenns klappt, dann ...
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
13.11.2010  
 



E.T. (13.11.10)
Super, das erstere sieht für mich so aus, als würde es machen, was ich suche.


Ihgitt bitte nimm abers 2.... das Erste ist ein übler Stinkschuh! ^^
 
13.11.2010  
 




E.T.
SO, ich komm der Sache näher: Nur wird jetzt das Vergleichen aufgerufen und das XProfan-Prog rennt weiter, es soll aber "warten"(oder warten>nachschauen ob vergl. fertig>ggf. Fenster aktualisieren>warten), ob Vergleichen schon fertig.
Würde ja denken mit Thread.Is(lThread) , aber steht ja bei XPSE "fehlerhaft"...
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
13.11.2010  
 



Schau mal hierzu nützliche APIs: [...] 

Einfach mit GetExitCodeThread schauen ob der Thread noch läuft oder vor dem Ende der ThreadProc per SendMessage ne UserMessage absenden um den Hauptprogramm etwas "mitzuteilen" oder einfach per Return-Wert aus der Thread-Proc den ThreadExitCode festlegen oder per ExitThread ThreadExitCode an beliebiger Stelle in der ThreadProc festlegen:
KompilierenMarkierenSeparieren
'URL: https://xprofan.com/intl/de/xpse/nproc-und-neuzeichnen-messages/#bottom
 {$cleq}
cls
long myThread=createThread(0,0,procAddr(eineProc),hWnd,0,0),b
print "fertig"

while 1

    waitinput 1000
    getExitCodeThread(myThread,addr(b))
    case b==123456 : break

wend

print "allesfertig"
end

nProc eineProc(long some)

    whileLoop 2

        setText(some,str$(getTickCount))
        sleep(1000)

    wend

    return 123456//oder exitThread(123456) wenn an beliebiger Stelle Thread abgewürgt werden soll wie "end 123456"

endProc

 
13.11.2010  
 




E.T.
Hm, GetThreadID()  wäre da wohl was, aber erst ab VISTA [...]  . Muss aber unter XP laufen...
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
13.11.2010  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

23.583 Betrachtungen

Unbenanntvor 0 min.
iF05.12.2018
p.specht07.01.2018
Ernst07.05.2016
funkheld28.04.2016
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

iF (15x)
E.T. (10x)
unbekannt (2x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie