Threaded B3D / BPlus
Übersicht

![]() |
Xaymarehemals "Cgamer"Betreff: Threaded B3D / BPlus |
![]() Antworten mit Zitat ![]() |
---|---|---|
(Ich habe mir erlaubt einen neuen Thread hierfür zu erstellen)
Threaded BB ist nun komplett funktionsfähig. Die Userlib funktioniert bei richtiger Benutzung perfekt. Beispiele werden noch folgen. ThreadedBB funktioniert nur auf Betriebssystemen älter als Vista und neuere als 2000 Vielen Dank an Silver_Knee für die Idee. Benötigt wird die Funktionszeiger Lib von Noobody ThreadedBB.decls Code: [AUSKLAPPEN] .lib "Kernel32.dll"
CreateMutex%( lpMutexAttributes*, bInitialOwner%, lpName$ ) : "CreateMutexA" OpenMutex%( dwDesiredAccess%, bInheritHandle%, lpName$ ) : "OpenMutexA" ReleaseMutex%( hMutex% ) : "ReleaseMutex" CreateThread%( lpThreadAttributes*, dwStackSize%, lpStartAddress%, lpParameter%, dwCreationFlags%, lpThreadId% ) : "CreateThread" GetExitCodeThread%( hThread% ) : "GetExitCodeThread" TerminateThread%( hThread%, dwExitCode% ) : "TerminateThread" ExitThread%( dwExitCode% ) : "ExitThread" WaitForSingleObject%( hHandle%, dwMilliseconds% ) : "WaitForSingleObject" WaitForMultipleObjects%( nCount%, lpHandles*, bWaitAll%, dwMilliseconds% ) : "WaitForMultipleObjects" CloseHandle%( hObject% ) : "CloseHandle" GetLastError%( ) : "GetLastError" FormatMessage$( dwFlags%, lpSource*, dwMessageId%, dwLanguageId%, lpBuffer$, nSize%, Arguments*) : "FormatMessage" ExitProcess( uExitCode% ) : "ExitProcess" .lib " " BB_CreateMutex%( Name$ ) BB_OpenMutex%( Name$, Inherit%, RequireFull% ) BB_ReleaseMutex%( hMutex% ) BB_WaitForMutex%( hMutex%, TimeOut% ) BB_WaitForMutexes%( TimeOut%, WaitForAll% ) BB_WaitForMutexes_Add%( hMutex% ) BB_CreateThread%( hPointer% ) BB_CloseThread%( hThread% ) ThreadedBB.bb BlitzBasic: [AUSKLAPPEN] ;Constants Threads: Ich empfehle Folgende Struktur für Threads: BlitzBasic: [AUSKLAPPEN] Local lblFunctionName ProgInit muss nach dem Initialisieren der Thread Codes auf 0 setzen, damit der Code ausgeführt wird. Um einen Thread zu erstellen verwenden wir BlitzBasic: [AUSKLAPPEN] hThreadName = BB_CreateThread( lblFunctionName ) Dieser Thread läuft nun nebenbei und zieht ressourcen sofern der Mutex frei ist, bzw kein Mutex exestiert. Um diesen Thread nun zu entfernen verwenden wir BlitzBasic: [AUSKLAPPEN] CloseHandle(hThreadName):BB_CloseThread(hThreadName) Mutex: Mutex eigenen sich perfekt für das warten lassen von Threads Um einen Thread warten zu lassen, bis ein anderer fertig ist müsst ihr vor allen BB_CreateThread( .. ) einen Mutex erstellt haben, ungefähr so: BlitzBasic: [AUSKLAPPEN] hMutexName = BB_CreateMutex() Damit ein Thread nun wartet und prüft ob dieser verfügbar ist muss folgendes gemacht werden: BlitzBasic: [AUSKLAPPEN] WaitResult = BB_WaitForMutex( hMutexName ) Beschreibung aller Befehle: BB_CreateMutex( [Name] ) ![]() BB_OpenMutex( Name[, Inherit, RequireFull] ) ![]() BB_ReleaseMutex( hMutex ) ![]() BB_WaitForMutex( hMutex[, TimeOut] ) ![]() BB_WaitForMutexes( [TimeOut, WaitForAll] ) ![]() BB_WaitForMutexes_Add( hMutex ) ![]() BB_CreateThread( pPointer ) ![]() BB_CloseThread( hThread ) ![]() ExitThread( ExitCode ) ![]() ExitProcess( ExitCode ) ![]() GetExitCodeThread( hThread ) ![]() Viel Spaß mit einem (bei mir zumindest nicht crashenden) Threaded BB ![]() |
||
Warbseite |
- Zuletzt bearbeitet von Xaymar am Mi, Nov 11, 2009 23:18, insgesamt einmal bearbeitet
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiß nicht genau ob das sinnvoll ist mit einem weiteren Thread dafür von mir aus kann man beides irgendwie zusammenfügen...
Außerdem hast du immer noch kein Beispiel angegeben und die ganzen Einschränkungen, die ich am Anfang geschrieben habe gelten auch noch. |
||
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit gleichzeitigem auf eine Variable zugreifen?
Nein funktioniert nun ohne Probleme. Nur schreiben/schreiben darf man nicht. Lesen/schreiben ist ok Lokale Variablen gehen auch Grafikbuffer ist so ein Ding. es können mehrere Threads gleichzeitig darauf zugreifen und zeichnen nur das flip muss in der Mainschleife(Außerhalb der Threads) stehen. Die Fehlermeldung auf dem "X" lässt sich unterdrücken, arbeite ich auch schon dran |
||
Warbseite |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sehr schön ![]() aber auch lob an Silver_Knee! werde schauen ob ich threaded b+ für mein Projekt TBP einsetzen kann ^^ mfg ozzi |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
sind die lokalen also benutzbar? ok. | ||
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei mir gabs keine Probleme damit. Also denke ich mal das es bei euch auch funktioniert | ||
Warbseite |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
ThreadedBB funktioniert nur auf Betriebssystemen älter als Vista und neuere als 2000
Habe es auf Windows 7 und Vista getestet. Crasht schon beim initialisieren der decls, da die Parameter wohl geändert wurden oder die Funktionen entfernt. Notiz in den ersten beitrag habe ich eingefügt. Zusätzlich kann ich daran nciht mehr weiterarbeiten da ich nun Windows 7 habe. Letzte Sources: ThreadedBB.decls Code: [AUSKLAPPEN] .lib "Kernel32.dll"
CreateMutex%( lpMutexAttributes*, bInitialOwner%, lpName$ ) : "CreateMutexA" OpenMutex%( dwDesiredAccess%, bInheritHandle%, lpName$ ) : "OpenMutexA" ReleaseMutex%( hMutex% ) : "ReleaseMutex" CreateThread%( lpThreadAttributes*, dwStackSize%, lpStartAddress%, lpParameter%, dwCreationFlags%, lpThreadId% ) : "CreateThread" GetExitCodeThread%( hThread% ) : "GetExitCodeThread" SuspendThread%( hThread% ) : "SuspendThread" ResumeThread%( hThread% ) : "ResumeThread" TerminateThread%( hThread%, dwExitCode% ) : "TerminateThread" ExitThread%( dwExitCode% ) : "ExitThread" WaitForSingleObject%( hHandle%, dwMilliseconds% ) : "WaitForSingleObject" WaitForMultipleObjects%( nCount%, lpHandles*, bWaitAll%, dwMilliseconds% ) : "WaitForMultipleObjects" CloseHandle%( hObject% ) : "CloseHandle" GetLastError%( ) : "GetLastError" FormatMessage$( dwFlags%, lpSource*, dwMessageId%, dwLanguageId%, lpBuffer$, nSize%, Arguments*) : "FormatMessage" ExitProcess( uExitCode% ) : "ExitProcess" .lib "user32.dll" FindWindow%( lpClassName$, lpWindowName$ ) : "FindWindowA" PeekMessage%( lpMsg*, hWnd%, wMsgFilerMin%, wMsgFilerMax%, wRemoveMsg% ) : "PeekMessageA" DispatchMessage%( lpMsg* ) : "DispatchMessageA" .lib " " BB_CreateMutex%( Name$, ID% ) BB_OpenMutex%( Name$, Inherit%, RequireFull% ) BB_KillMutex%( hMutex% ) BB_LockMutex%( hMutex% ) BB_UnLockMutex%( hMutex% ) BB_CloseMutex%( hMutex% ) BB_WaitForMutex%( hMutex%, TimeOut% ) BB_WaitForMutexes%( TimeOut%, WaitForAll% ) BB_WaitForMutexes_Add%( hMutex% ) BB_CreateThread%( hPointer% ) BB_PauseThread%( hThread% ) BB_UnpauseThread%( hThread% ) BB_KillThread%( hThread% ) BB_CloseThread%( hThread% ) ThreadedBB.bb Code: [AUSKLAPPEN] ;Constants
Const WAIT_OBJECT_0 = $00000080 Const WAIT_ABANDONED = $00000000 Const WAIT_TIMEOUT = $00000102 Const WAIT_FAILED = $FFFFFFFF Const PM_NOREMOVE = $0 Const PM_REMOVE = $1 ;Types - Used by Windows Type SECURITY_ATTRIBUTES Field nLength Field lpSecurityDescriptor.SECURITY_ATTRIBUTES Field bInheritHandle End Type Type MSG Field hwnd Field message Field wParam Field lParam Field time Field pt End Type ;Types - Used by Functions Global MutexCount = 0 Type MutexList Field hMutex End Type ;Functions - Mutex Function BB_CreateMutex( Name$="" ) Local SA.SECURITY_ATTRIBUTES SA = New SECURITY_ATTRIBUTES SA\nLength = 8 SA\lpSecurityDescriptor = Null ;No Security SA\bInheritHandle = 0 ;No Childs Mutex = CreateMutex( SA, False, Name$ ) If Mutex = 0 Return 0 EndIf Return Mutex End Function Function BB_OpenMutex( Name$, Inherit=False, RequireFull=False ) Local SA.SECURITY_ATTRIBUTES If RequireFull = False Mutex = OpenMutex( 0, Inherit, Name ) Else ;MSDN: ;MUTEX_ALL_ACCESS (0x1F0001) ;All possible access rights for a mutex object. ;Use this right only if your application requires access beyond that granted by the standard access rights. ;Using this access right increases the possibility that your application must be run by an Administrator. Mutex = OpenMutex( $1F0001, Inherit, Name ) EndIf Return Mutex End Function Function BB_LockMutex( hMutex ) Return BB_WaitForMutex( hMutex, $FFFFFFFF ) End Function Function BB_UnLockMutex( hMutex ) Return BB_KillMutex( hMutex ) End Function Function BB_KillMutex( hMutex ) Return ReleaseMutex( hMutex ) End Function Function BB_CloseMutex( hMutex ) CloseHandle( hThread ) Return BB_KillMutex( hMutex ) End Function Function BB_WaitForMutex( hMutex, TimeOut=1000 ) Return WaitForSingleObject( hMutex, TimeOut ) End Function Function BB_WaitForMutexes( TimeOut=1000, WaitForAll=True ) Local Bank = CreateBank(MutexCount*4), Count = 0 Local ML.MutexList For ML = Each MutexList PokeInt Bank, Count*4, ML\hMutex Count = Count + 1 Next Delete Each MutexList Status = WaitForMultipleObjects( MutexCount , Bank, WaitForAll, TimeOut ) FreeBank Bank Return Status End Function Function BB_WaitForMutexes_Add( hMutex ) Local ML.MutexList If hMutex <> 0 ML = New MutexList ML\hMutex = hMutex MutexCount = MutexCount + 1 Return 1 EndIf Return 0 End Function ;Functions - Thread Function BB_CreateThread( hPointer ) Local SA.SECURITY_ATTRIBUTES SA = New SECURITY_ATTRIBUTES SA\nLength = 8 SA\lpSecurityDescriptor = Null ;No Security SA\bInheritHandle = 0 ;No Childs Local Bank = CreateBank() Thread = CreateThread( SA, 10240, hPointer, Bank, $0001, ID) Delete SA Return Thread End Function Function BB_PauseThread( hThread ) Return SuspendThread( hThread ) End Function Function BB_UnpauseThread( hThread ) Return ResumeThread( hThread ) End Function Function BB_KillThread( hThread ) Return TerminateThread( hThread, GetExitCodeThread( hThread ) ) End Function Function BB_CloseThread( hThread ) CloseHandle hThread Return BB_KillThread( hThread ) End Function ;BB Window Handler Global BBhWnd Function BB_InitWindow( WName$ ) BBhWnd = FindWindow( "Blitz Runtime Class", WName$ ) End Function Function BB_WindowMessage() Local MS.MSG MS = New MSG PeekMessage( MS, BBhWnd, 0, 0, 0 ) DispatchMessage( MS ) ;Undone. Needs fixing End Function ;Functions - Error Function BB_CheckError() ;Returns MAV-.- use "If GetLastError() Not 0" instead Local Error = GetLastError() If Error <> 0 Bank = CreateBank(1024) FormatMessage($000010FF, 0, Error, $0, Stra$, 1000, 0) StrI$ = "" For Cur = 0 To 1023 Byte = PeekByte(Bank, Cur) If Byte > 0 StrI = StrI + Chr(Byte) Else Exit EndIf Next RuntimeError StrI EndIf End Function Vielleicht hat ja jemand anderes lust daran weiterzuarbeiten |
||
Warbseite |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
hol dir doch den XPMode, dann kannst dus auch unter win 7 laufen lassen. zumindest für die weiterentwicklung wirds reichen. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Xaymarehemals "Cgamer"Betreff: FastPointer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da meine Userlib auf neueren Betriebssystemen nicht mehr so ganz funktioniert, empfehle ich euch FastPointer
Die lib scheint weitaus besser dokumentiert als meine und auch sicherer zu sein. |
||
Warbseite |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klingt gut muss ich sagen. Außerdem find ich den Trick gut den funktionasuafruf mit nem goto zu verstecken und den funktionspointer einfach durch "am goto vorbei rechenen" zu holen. Das spart diese proginit-variablen. | ||
![]() |
Jo0oker |
![]() Antworten mit Zitat ![]() |
---|---|---|
@CGamer
Zitat: ThreadedBB funktioniert nur auf Betriebssystemen älter als Vista und neuere als 2000
Also nur mit XP...? lg Jo0oker |
||
Tehadon, das kostenlose 3D RPG
www.tehadon.de http://www.blitzforum.de/worklogs/14/ Das Abenteuer wird beginnen! |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja. Anscheinend wurden die Funktionen der DLLs verändert | ||
Warbseite |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
muss sich aber auf die mutex beziehen
hab ja selbst vista und hab des threaded laufen lassen noch ohne mutex |
||
![]() |
FireballFlameBetreff: Re: FastPointer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Cgamer hat Folgendes geschrieben: Da meine Userlib auf neueren Betriebssystemen nicht mehr so ganz funktioniert, empfehle ich euch FastPointer
Die lib scheint weitaus besser dokumentiert als meine und auch sicherer zu sein. Ja! Funktioniert auch soweit bei mir unter Vista! Aber hat jemand ne Idee ob/wie man darin Mutexes oder Semaphore benutzen kann? Ansonsten kann man ja nicht viel mit dem Threading machen... |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eigentlich ist an den Funktionen nichts geändert worden. Man könnte aber mal versuchen, die SECURITY_ATTRIBUTES bei CreateThread und CreateMutex weg zu lassen. Die sind sowieso unnötig. | ||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
speziell wenn man die funktion mit 12 byte füttert, aber eine nLength von 8 angibt ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
ChristianK hat Folgendes geschrieben: Eigentlich ist an den Funktionen nichts geändert worden. Man könnte aber mal versuchen, die SECURITY_ATTRIBUTES bei CreateThread und CreateMutex weg zu lassen. Die sind sowieso unnötig. Wie meinst du das, bzw. wie soll man die weglassen?
Dreamora hat Folgendes geschrieben: speziell wenn man die funktion mit 12 byte füttert, aber eine nLength von 8 angibt An nLength was zu ändern, bringt nichts.
![]() |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
ChristianK hat Folgendes geschrieben: Eigentlich ist an den Funktionen nichts geändert worden. Man könnte aber mal versuchen, die SECURITY_ATTRIBUTES bei CreateThread und CreateMutex weg zu lassen. Die sind sowieso unnötig.
Nicht ganz. Ich habe Probleme auf Globals zuzugreifen ohne einen Typeeintrag Zitat: speziell wenn man die funktion mit 12 byte füttert, aber eine nLength von 8 angibt
![]() BlitzBasic: [AUSKLAPPEN] SA = New SECURITY_ATTRIBUTES Ist schon richtig. SA\nLength muss nur höher wenn ich mehrere SECURITY_ATTRIBUTES verwenden will |
||
Warbseite |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum stürzt es dann nach spätestens 20 Sekunden immer ab? | ||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code? | ||
Warbseite |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group