Thread, im Hauptfenster ist ein Problem aufgetreten [Not Responding]
Verfasst: 28.05.2024 03:43
Ich bin neu bei PB.
Meine Hauptsprache ist weder Deutsch noch Englisch/US.
Ich nutze Google Translate.
Ich lerne etwas über Threads in einem Hauptfenster.
Hier gibt es eine Schaltfläche, ich möchte den SHA1-Code für 3 Dateien überprüfen, jede Datei ist über 4 GB groß.
Wenn der SHA1-Code nicht übereinstimmt, möchte ich eine Benachrichtigung geben und den Tastendruck stoppen.
Wie behebe ich das Problem „Keine Reaktion“ und das Problem, dass der Uhr-Thread angehalten wurde ?.
Meine Hauptsprache ist weder Deutsch noch Englisch/US.
Ich nutze Google Translate.
Ich lerne etwas über Threads in einem Hauptfenster.
Hier gibt es eine Schaltfläche, ich möchte den SHA1-Code für 3 Dateien überprüfen, jede Datei ist über 4 GB groß.
Wenn der SHA1-Code nicht übereinstimmt, möchte ich eine Benachrichtigung geben und den Tastendruck stoppen.
Wie behebe ich das Problem „Keine Reaktion“ und das Problem, dass der Uhr-Thread angehalten wurde ?.
Code: Alles auswählen
CompilerIf #PB_Compiler_Thread = 0
CompilerWarning "Enable thread safe option!"
CompilerEndIf
EnableExplicit
;- Enumerations
Enumeration Window
#mainWindow
EndEnumeration
Enumeration Gadgets
#Btn_get_SHA1
#String_SHA1
#Txt_Clock
#Txt_1
#Edit_1
EndEnumeration
Structure _THREAD_
ID.i
File$
StopIt.i
EndStructure
Declare.i update_clock(ii)
Procedure.i update_clock(ii)
Repeat
SetGadgetText(#Txt_Clock, FormatDate("%hh:%ii:%ss", Date()))
Delay(500)
ForEver
EndProcedure
Procedure Resize_mainWindow()
Protected Window_0_WidthIni = 500, Window_0_HeightIni = 150
Protected ScaleX.f, ScaleY.f
ScaleX = WindowWidth(#mainWindow) / Window_0_WidthIni : ScaleY = WindowHeight(#mainWindow) / Window_0_HeightIni
ResizeGadget(#Txt_1, ScaleX * 10, ScaleY * 10, ScaleX * 90, ScaleY * 25)
ResizeGadget(#String_SHA1, ScaleX * 110, ScaleY * 10, ScaleX * 290, ScaleY * 25)
ResizeGadget(#Btn_get_SHA1, ScaleX * 410, ScaleY * 10, ScaleX * 80, ScaleY * 25)
ResizeGadget(#Txt_CLOCK, ScaleX * 210, ScaleY * 50, ScaleX * 60, ScaleY * 25)
ResizeGadget(#Edit_1, ScaleX * 10, ScaleY * 80, ScaleX * 480, ScaleY * 60)
EndProcedure
Procedure Open_mainWindow(X = 0, Y = 0, Width = 500, Height = 150)
OpenWindow(#mainWindow, X, Y, Width, Height, "get SHA1 without NOT RESPONDING problem", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
TextGadget(#Txt_1, 10, 10, 90, 25, "SHA1 output:", #SS_CENTERIMAGE)
StringGadget(#String_SHA1, 110, 10, 290, 25, "sha1...", #PB_String_ReadOnly)
ButtonGadget(#Btn_get_SHA1, 410, 10, 80, 25, "get SHA1")
TextGadget(#Txt_CLOCK, 210, 50, 60, 25, "8:18:18", #PB_Text_Center | #SS_CENTERIMAGE)
EditorGadget(#Edit_1, 10, 80, 480, 60)
AddGadgetItem(#Edit_1, -1, "Act log...")
CreateThread(@update_clock(),0)
BindEvent(#PB_Event_SizeWindow, @Resize_mainWindow(), #mainWindow)
PostEvent(#PB_Event_SizeWindow, #mainWindow, 0)
EndProcedure
Global vSHA1$, MyThread._THREAD_
Procedure get_SHA1(*T._THREAD_)
UseSHA1Fingerprint()
Protected *Buffer = AllocateMemory($100000)
Protected readByte, t2, t1 = ElapsedMilliseconds()
Protected outSHA1$
If (ReadFile(0, *T\File$))
If (*Buffer) And (StartFingerprint(0, #PB_Cipher_SHA1))
While Eof(0) = 0
readByte = ReadData(0, *Buffer, MemorySize(*Buffer))
AddFingerprintBuffer(0, *Buffer, readByte)
If *T\StopIt
CloseFile(0)
ProcedureReturn
EndIf
Wend
CloseFile(0)
outSHA1$ = FinishFingerprint(0)
FreeMemory(*Buffer)
EndIf
Else
Debug "File: " + *T\File$ + " not found"
EndIf
vSHA1$ = outSHA1$
t2 = ElapsedMilliseconds()
*T\ID = #Null
Debug "Elapsed: " + StrF((t2 - t1) / 1000) + " seconds"
Debug vSHA1$
EndProcedure
Open_mainWindow()
;- Main Program
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
If MyThread\ID And IsThread(MyThread\ID)
MyThread\StopIt = #True
WaitThread(MyThread\ID)
EndIf
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_get_SHA1
MyThread\File$ = GetCurrentDirectory() + "win8.iso"
If MyThread\File$
MyThread\StopIt = #Null
MyThread\ID = CreateThread(@get_SHA1(), @MyThread)
EndIf
If IsThread(MyThread\ID)
WaitThread(MyThread\ID)
EndIf
SetGadgetText(#Edit_1, "win8 sha1: " + vSHA1$)
;
MyThread\File$ = GetCurrentDirectory() + "win10.iso"
If MyThread\File$
MyThread\StopIt = #Null
MyThread\ID = CreateThread(@get_SHA1(), @MyThread)
EndIf
If IsThread(MyThread\ID)
WaitThread(MyThread\ID)
EndIf
SetGadgetText(#Edit_1, "win10 sha1: " + vSHA1$)
;
MyThread\File$ = GetCurrentDirectory() + "win11.iso"
If MyThread\File$
MyThread\StopIt = #Null
MyThread\ID = CreateThread(@get_SHA1(), @MyThread)
EndIf
If IsThread(MyThread\ID)
WaitThread(MyThread\ID)
EndIf
SetGadgetText(#Edit_1, "win11 sha1: " + vSHA1$)
EndSelect
EndSelect
ForEver