 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.11.2011, 04:47 Titel: Threading/Mutex/Screenlock... |
|
|
Moin,
Hab mal eine Frage bezüglich des nutzens von Mutexlock/Mutexunlock im zusammenspiel mit screenlock/screenunlock
Ich hab mir ein einfaches Fensterhandle gebastelt als eigenen Thread (Splashscreen mit Mouseover Button und Moveeigenschaften)
Ich hab mir zu diesen zweck dann zwei handle mit Mutexcreate erstellt, eins für die allgmeinen Thread und Fensterhandle und eins für Grafikoperationen (Gemeinsame Imagebuffer usw) Und diesen benutze ich dann im moment auch quasi vor einem Screenlock/Screenunlock
Allerdings scheint das so nicht zu funktionieren, wenn ich in meinem Mainprogramm und im Thread trotz des Mutexlock, Screenlock/Screenunlock aufrufe, kann es sein das es zeitweise ganz gut funktioniert wie erwartet... aber ich hab das nun eine weile getestet und es ist eigentlich nur eine frage der Zeit bis da irgendwas kollidiert und alles einfriert...
Mal ein kleines Beispiel Pseudocode:
Code: |
Sub mein_Thread()
do
If irgendwas_passiert then
Mutexlock(grafikmutex)
Screenlock
put (100,100),irgendwas,pset
screenunlock
Mutexunlock(grafikmutex)
End If
loop
End Sub
'Mainloop
do
If Iregendwas_passiert then
Mutexlock(grafikmutex)
Screenlock
Put (100,100),irgendwas,pset
Screenunlock
Mutexunlock(grafikmutex)
End If
loop
|
Edit:
Habs nu mit einem ImageBuffer und nur einem kleinen 'refresh' zusatz im Thread mit Screenlock/Screenunlock gemacht, und ist noch schlimmer als vorher...
Vielleicht kann mal einer über die Thread routine gucken und sagen was da schief läuft?
New_DashIt.zip
Edit2:
Kann doch echt ned sein, hab nun den kompletten Mutexdreck raus, kein screenlock nichts und so lief es wenigstens mal schinbar die ersten minuten ohne irgendwelche probleme allerdings hat sich dann alles komplett aufgehangen, wenn ich nur screenlock benutze hängt der thread teilweise (aktualisiert nichts)
Kann doch nicht so schwer sein ein einzigen Thread zu handlen
Code: |
'#include once "windows.bi"
#Include once "GRX/WinFrame_GRX.bas"
#Include once "GRX/CloseButton_GRX.bas"
#Include once "GRX/CloseButtonMouseOver_GRX.bas"
Namespace DashIt
Declare Sub Init()
Declare Sub Done()
Namespace Windows
Declare Sub MainWindow()
Dim Shared as any ptr mutex
Dim Shared as any ptr hnd
Dim Shared as Integer terminate
Dim Shared as Integer WinClose
Dim Shared as any ptr WinBuffer
' End Namespace 'DashIt.Windows
' Namespace Windows
Public Function CloseMessage() as Integer
'Mutexlock(mutex)
If terminate Then WinClose=1
Function = WinClose
'Mutexunlock(mutex)
End Function
Public Sub Update()
'Mutexlock(mutex)
'screenlock
Put (0,0),WinBuffer,pset
'screenunlock
'Mutexunlock(mutex)
End Sub
Public Function InRange(byval fromX as Integer, byval fromY as Integer, byval toX as Integer, byval toY as Integer) as Integer
Dim as Integer MX,MY
GetMouse MX,MY
If (MX >= fromX) and (MY >= fromY) and (MX <= toX) and (MY <= toY) Then Return 1
Return 0
End Function
Private Sub MainWindow()
Dim as any ptr Windows_Frame = WinFrame_GRX
Dim as any ptr Windows_CloseButton = CloseButton_GRX
Dim as any ptr Windows_CloseButton_MouseOver = CloseButtonMouseOver_GRX
Dim as Integer MX, MY, MB
Dim as Integer CB, OCB
'Mutexlock(mutex)
Put WinBuffer,( 0, 0), Windows_Frame, pset
Put WinBuffer,(558, 3), Windows_CloseButton, pset
'Mutexunlock(mutex)
Do
sleep 1 'thread/cpu break
GetMouse MX,MY,,MB
'>>> CloseButton Handling:
If InRange(557,2,573,17) Then
CB=1
If MB=1 Then
'Mutexlock(mutex)
WinClose = 1
'Mutexunlock(mutex)
End If
Else
CB=0
End If
If CB<>OCB Then
OCB=CB
'Mutexlock(mutex)
If CB=0 Then
Put WinBuffer,(558, 3), Windows_CloseButton, pset
Else
Put WinBuffer,(558, 3), Windows_CloseButton_MouseOver, pset
End If
'Mutexunlock(mutex)
End If
'<<< CloseButton Handling
Update()
Loop until CloseMessage()
Imagedestroy (Windows_Frame)
Imagedestroy (Windows_CloseButton)
Imagedestroy (Windows_CloseButton_MouseOver)
End Sub
End Namespace 'DashIt.Windows
'' DashIt.Init()
Public Sub Init()
Screenres 580, 490, 32, , &h10
Windows.terminate = 0
'Windows.mutex = Mutexcreate
Windows.WinBuffer=Imagecreate(580, 490, &hFFFF00FF)
Windows.hnd = Threadcreate(cast(any ptr, @Windows.MainWindow))
End Sub
'' DashIt.Done()
Public Sub Done()
'Mutexlock(Windows.mutex)
Windows.terminate = 1
'Mutexunlock(Windows.mutex)
Threadwait(Windows.hnd)
Mutexdestroy(Windows.mutex)
End Sub
End Namespace 'DashIt
DashIt.Init()
do
sleep 1 'cpu break
if asc(inkey) then exit do
loop until DashIt.Windows.CloseMessage()
DashIt.Done()
|
_________________
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 05.11.2011, 19:53 Titel: |
|
|
hi. das problem kenne ich sehr gut. es liegt am maus / tasta in kombination mit gfx.
sperre einfach mous /tasta mit dem selben mutex das du für gfx nutzt. sprich, diese funktionen dürfen nicht gleichzeitig aufgerufen werden. hier gibts leider probleme mit dem multithreading.
dann sollts eigetnlich funzen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.11.2011, 22:12 Titel: |
|
|
Das war eine überraschend einfache lösung nachdem ich bisher wirklich alle möglichen lösungsansätze versucht habe, aber auf das sperren von Maus- und Tastaturabfragen bin ich nicht gekommen...
Finde es allerdings auch etwas übertrieben das ich quasi JEDE ein- und ausgabe 'sichern' muss...
Aber es sieht zumindest so aus als würde es jetzt funktionieren (Trau dem ganzen noch nicht )
Vielen Dank _________________
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 05.11.2011, 22:16 Titel: |
|
|
das liegt eigentlich daran, weil maus und tasta nicht threadsafe sind. gfx is dies zwar, allerdings liegen gfx und io in diesem falle sehr nach beieinander (fb intern). vorallem unter linux gibts da ziemliche probs in bezug auf den X-Server, welcher sowohl gfx als auch io verwaltet.
greift man hier aus 2 threads darauf zu, führt man parallel 2 operationen "mit" dem x aus, was zu nem prob führen kann.
wie das ganze unter win aussieht kann ich allerdings nicht sagen. könnte aber ähnliche problematisch sein.
[EDIT]: du kannst ja in einem thread ständig das "draw" aufrufen udn anschliessend einen "screenshot" von der tasta und der maus machen. dann kannst du später über den 2th. thread mit den erfassten daten arbeiten, ohne das du sie erneut abfragen musst.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 06.11.2011, 12:24 Titel: |
|
|
Wie TPM gesagt hat, ist das unter Linux idR besonders kritisch, da der X-Server beides handelt.
Unter Windows kommt es darauf an™: Wenn du GDI benutzt (das müsste im Standard 2D-Modus von gfx der Fall sein), läuft es im Prinzip auch durch die gleiche Schnittstelle, mit OpenGL ist es komplett getrennt, mit DirectX kommt es darauf an™, ob du DirectInput oder GDI-"Input" benutzt.
Alles net so einfach  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.11.2011, 10:20 Titel: |
|
|
Weiss jemand 'näheres' beim Einsatz von Imagecreate und Imagedestroy?
Bisweilen klappt inzwischen eigentlich alles recht gut, aber ab und an frirt sich immernoch was ein, und ich wüsste nicht was sonst noch dran 'schuld' sein könnte... _________________
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|