Seite 1 von 1

Thread, im Hauptfenster ist ein Problem aufgetreten [Not Responding]

Verfasst: 28.05.2024 03:43
von hoangdiemtinh
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 ?.

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

Re: Thread, im Hauptfenster ist ein Problem aufgetreten [Not Responding]

Verfasst: 28.05.2024 09:36
von mk-soft
Schaue dir die Beispiele von Mini Thread Control an

Re: Thread, im Hauptfenster ist ein Problem aufgetreten [Not Responding]

Verfasst: 28.05.2024 10:40
von HeX0R
Bitte bleib in dem entsprechenden Thread => https://www.purebasic.fr/english/viewtopic.php?t=84381
Die selben Fragen in verschiedenen Foren zu stellen, wird nicht gerne gesehen!