Habe ein Programm mit mehreren Threads - einer davon ist mein "Druck-Thread" und die Daten, die gedruckt werden sollen möchte ich einfach als Speicherbereich übergeben.
Aktuell habe ich es so gelöst, das ich den Pointer auf den Speicher einfach in eine Liste schreibe und die Adresse im anderen Thread wieder auslese und dann dort auch den Speicher wieder freigebe.
Habe hier mal ein kurzes Beispiel zusammengeschustert:
Code: Alles auswählen
Structure TestList
*MemAddress
sName.s
EndStructure
Global TestSem=CreateSemaphore()
Global TestMutex=CreateMutex()
Global NewList TestFileList.TestList()
Global iCloseAllThreads.i=0
Global CloseMutex=CreateMutex()
Procedure.i ReadFileThread(*Wert)
Protected iHelp.i, iSize.i, *FileData, iCloseThread.i=0
While (iCloseThread=0)
LockMutex(CloseMutex)
iCloseThread=iCloseAllThreads
UnlockMutex(CloseMutex)
iHelp=ReadFile(#PB_Any, "C:\Users\roland\Desktop\print.txt")
If iHelp
iSize = Lof(iHelp)
*FileData = AllocateMemory(iSize)
ReadData(iHelp, *FileData, iSize)
CloseFile(iHelp)
LockMutex(TestMutex)
LastElement(TestFileList())
AddElement(TestFileList())
TestFileList()\MemAddress=*FileData
TestFileList()\sName=Str(ElapsedMilliseconds())
UnlockMutex(TestMutex)
SignalSemaphore(TestSem)
EndIf
Delay(2000)
Wend
EndProcedure
Procedure.i WriteFileThread(*Wert)
Protected iHelp.i, iSize.i, iCloseThread.i=0
While (iCloseThread=0)
LockMutex(CloseMutex)
iCloseThread=iCloseAllThreads
UnlockMutex(CloseMutex)
If TrySemaphore(TestSem)
LockMutex(TestMutex)
While FirstElement(TestFileList())<>0 ;solange ein erster eintrag existiert
iHelp=CreateFile(#PB_Any, "C:\Users\roland\Desktop\thread_test\print_write"+TestFileList()\sName+".txt")
If iHelp
iSize = MemorySize(TestFileList()\MemAddress)
WriteData(iHelp, TestFileList()\MemAddress, iSize)
CloseFile(iHelp)
FreeMemory(TestFileList()\MemAddress)
FirstElement(TestFileList())
DeleteElement(TestFileList())
EndIf
Wend
UnlockMutex(TestMutex)
Else
Delay(500)
EndIf
Wend
EndProcedure
OpenConsole()
Define iThread1.i, iThread2.i
PrintN("threads werden gestartet")
iThread1=CreateThread(@ReadFileThread(), #Null)
iThread2=CreateThread(@WriteFileThread(), #Null)
PrintN("mit ESC beenden")
Repeat
KeyPressed$ = Inkey()
Delay(10)
Until KeyPressed$ = Chr(27) ; Wartet, bis Escape gedrückt wird
CloseConsole()
Macht mein Beispiel Sinn oder ist das komplett verkehrt? Wie kann man es besser machen? Die Datenmenge ist ja nicht fix - daher brauche ich einfach einen dynamischen Weg der Datenübergabe.. bin für alle Ideen offen.
Danke!
Roland