Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Threading/Mutex/Screenlock...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.11.2011, 04:47    Titel: Threading/Mutex/Screenlock... Antworten mit Zitat

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 peinlich 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 peinlich
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 05.11.2011, 19:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.11.2011, 22:12    Titel: Antworten mit Zitat

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 grinsen)

Vielen Dank
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 05.11.2011, 22:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 06.11.2011, 12:24    Titel: Antworten mit Zitat

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 durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.11.2011, 10:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz