read error at adress 17 bei sämtlichen Untils

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

read error at adress 17 bei sämtlichen Untils

Beitrag von Joel »

Hallo,

Ich bekomme seit neustem bei sämtlichen Until Befehlen in meinem Programm immer die Meldung: "read error at adress 17". Könnt ihr mir sagen, wann so eine Fehlermeldung auftritt oder ist das bei jedem Code anders??
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Die Fehlermeldung kommt wenn eine Funktion auf einen Speicherbereich
zugreifen will, dieser aber ungueltig ist. Ohne Code kann man da aber
nicht mehr zu sagen.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Ok, ich Poste mal den Code, ich habe das Problem zwar gelöst, aber ich habe ein anderes. Ich erkläre mein Programm mal kurz.

Ich gebe in ein Fenster einen Pfad ein, z.B. "C:\", dann Programm findet auf dem Cleint PC (in dem Fallmein Desktop Pc) heraus, welche Dateien und Ordner darauf Existieren, und sendet dass wieder an den Server weiter.

Das Problem: Bei Ordnern wird immer ein Ordner vor dem Namen angezeigt und bei Dateien eine Datei. Wenn ich jedoch ein zweites mal einen Praf angebe, und das Program dann wieder den Thread, der die Dateien anzeigt erstellt, dann werden die Bilder nichtmehr Angezeigt. Wiso?

Server:

Code: Alles auswählen

Global mmThread
Global Win.s
Global mmKill
Global ListThread
E = 0
F = 0
Win.s = GetEnvironmentVariable("windir")
Global mmThread


Procedure ListIcon()
If OpenWindow(10, 0, 0, 500, 550, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(10))
  UseJPEGImageDecoder()
ListIconGadget(11,  1,  1, 599, 550, "Name", 300)
   AddGadgetColumn(11, 1, "Größe in Byte", 200)

LoadImage(4, "C:\1.JPEG", 0)
LoadImage(5, "C:\Datei.jpg", 0)

ReadFile(8, Win.s+"\Inhalt.txt")
ColumnPos = 0
For x = 1 To 500

a$ = ReadString(8, 0)
b$ = ReadString(8, 0)
c$ = ReadString(8, 0)

If a$ = "Datei"
AddGadgetItem(11, -1, b$ , ImageID(5))
SetGadgetItemText(11, ColumnPos, c$, 1)
EndIf 

If a$ = "Ordner"
AddGadgetItem(11, -1, b$ , ImageID(4))
SetGadgetItemText(11, ColumnPos, c$, 1)
EndIf 
ColumnPos+1
Next   
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  EndProcedure 
  
Procedure Ort()
If OpenWindow(8, 300, 400, 300, 300, "Durchsuchen", #PB_Window_MinimizeGadget | #PB_Window_SystemMenu)
     If CreateGadgetList(WindowID(8))
     StringGadget(9, 1, 1, 100, 25, "" , 0) 
     ButtonGadget(5, 100, 30, 40, 40, "OK", 0)
     EndIf 
    Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 5
        Text$ = GetGadgetText(9)
          CreateFile(4, "C:\drf.txt")
          WriteStringN(4, ""+Text$+"", 0)
          CloseWindow(8)
          CloseFile(4)
          G = 4
          EndSelect
          EndIf  
          
          Until EventID = #PB_Event_CloseWindow Or G = 4
          
        EndIf 
EndProcedure

Procedure Fenster_1() 
 
  ClientID = EventClient() 
If  OpenWindow(0, 50, 100, 300, 500, "Server zum Herunterfaheren" , #PB_Window_SystemMenu , 0) 
If CreateGadgetList(WindowID(0)) 
ButtonGadget(1, 10, 290, 250, 30, "Durchsuchen")
EndIf 
  

 Repeat
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget

      Select EventGadget()
          
      Case 1
       Ort()
     SendNetworkFile(ClientID, "C:\drf.txt")
     Delay(1000)
     DeleteFile("C:\drf.txt")
     SendNetworkString(ClientID, "RausRaus")
     
     Repeat 
     If F = 70

     CloseWindow(0)
     F = 0
     EndIf 
     Until m = 55
     
      
      EndSelect

    EndIf

  Until EventID = #PB_Event_CloseWindow

EndIf

Delay(99999999)
EndProcedure 

If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 

Port = 6705
Buffer = AllocateMemory(1000) 

If CreateNetworkServer(0, Port) 

  
  Repeat 
  Delay(200)
     SEvent = NetworkServerEvent() 
  
    If SEvent 
    
      ClientID = EventClient() 
      
      Select SEvent 
      
        Case 1 

        mmThread = CreateThread(@Fenster_1(), 453)
        Delay(100)

        
       
       Case 2
       Datenpuffer.s = Space(4) 
  ReceiveNetworkData(ClientID, @Datenpuffer, 4) 
          If Datenpuffer = "drin"
        CopyFile(Win.s+"\fm.png", Win.s+"\Inhalt.txt")
        If  IsThread(ListThread)
        KillThread(ListThread)
        KillThread(mmThread)
        Delay(1000)
        EndIf 
        ListThread = CreateThread(@ListIcon(), 888)
mmThread = CreateThread(@Fenster_1(), 453)
EndIf 
       
        Case 3
      DeleteFile(Win.s+"\fm.png")
     
       ReceiveNetworkFile(ClientID, Win.s+"\fm.png")
    
              
       Case 4
       KillThread(abc)
       CloseNetworkConnection(ClientID)
       CloseNetworkServer(0)
       MessageRequester("Trennug", "Der Client wurde getrennt", 0)
       KillThread(mmThread)
       End 
      
        Sel_ende:
    EndSelect 
    EndIf 
    
       Until Quit = 1 
        
         EndIf 
         End  
Client:

Code: Alles auswählen

; 
; ------------------------------------------------------------ 
; 
;   Mein kleiner Client
; 
;    
; 
; ------------------------------------------------------------ 
; 
Global ff
Global Win.s
Global Pfad$
Win.s = GetEnvironmentVariable("windir")


Procedure Namen()
ReadFile(3, Win.s+"\Pfad.txt")



Pfad$ = ReadString(3, 0)
If Pfad$ <> "" 
  FF = CreateFile(#PB_Any, Win.s+"\Inhalt.txt") 
  If FF 
     ED = ExamineDirectory(#PB_Any, Pfad$, "*.*") 
    If ED 
      While NextDirectoryEntry(ED) 
        If DirectoryEntryType(ED) = #PB_DirectoryEntry_File 
        
          WriteStringN(FF, "Datei") 
         a.q = DirectoryEntrySize(ED)
          
        Else 
          WriteStringN(FF, "Ordner") 
         a.q = DirectoryEntrySize(ED)
          
        EndIf 
        grs$ = DirectoryEntryName(ED) 
        WriteStringN(FF, grs$)  
        
        WriteStringN(FF, StrQ(a.q)) 
      Wend 
      FinishDirectory(ED) 
    EndIf 
    CloseFile(FF)  
  EndIf 
EndIf
EndProcedure 
  
 

 Procedure Ort()
If OpenWindow(8, 300, 400, 300, 300, "jjjjjj", #PB_Window_MinimizeGadget)
     If CreateGadgetList(WindowID(8))
     StringGadget(9, 1, 1, 30, 30, "" , 0) 
     ButtonGadget(5, 100, 30, 40, 40, "OK", 0)
     EndIf 
     
     
    Repeat
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget

      Select EventGadget()
        Case 5
          Text$ = GetGadgetText(9)
          CreateFile(4, "C:\drf.txt")
 If ExamineDirectory(0, Text$, "*.*")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Type$ = " [File] "
      Else
        Type$ = " [Sub-Dir] "
      EndIf
      grs$ = DirectoryEntryName(0) + Type$ +""
      WriteString(4, ""+grs$+"|", 0)
    Wend
    FinishDirectory(0)
  EndIf
  Delay(500)
  EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow
        EndIf 
        
EndProcedure


;-Vorbereiten der Netzwerk-Einstellungen
If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 

Port = 6705

;-Schleife zur Verbindungs-Herstellung
  Repeat 
  ConnectionID = OpenNetworkConnection("127.0.0.1", Port) 
Delay(300) 
Until ConnectionID <> 0 

;-Daten-empfang-Schleife
Repeat 
Delay(300)
    
    ServerID = NetworkClientEvent(ConnectionID) 
    Select ServerID
 
  Case 2 
  Repeat 
  Datenpuffer.s = Space(8) 
  ReceiveNetworkData(ConnectionID, @Datenpuffer, 8) 

 
If Datenpuffer = "RausRaus"
CopyFile(Win.s+"\Unbekannt.exe", Win.s+"\Pfad.txt")
DeleteFile(Win.s+"\Unbekannt.exe")
Namen()
SendNetworkFile(ConnectionID, Win.s+"\Inhalt.txt")
SendNetworkString(ConnectionID, "drin")
DeleteFile(Win.s+"\Pfad.txt")
f = 1
EndIf 


If Datenpuffer = "Aufzeich"
Debug "jaja"
EndIf 


  Until f = 1
  
  

Case 3
ReceiveNetworkFile(ConnectionID, Win.s+"\Unbekannt.exe")

 
Case 4
Delay(3000)
 
  
  EndSelect 
  
 Until Quit = 1
 
  End   
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ersetze Deine Delays mal durch fensterfreundliche Alternativen und
KillThread ist genauso böse, dann mach es lieber ohne Threads.

In dieser Form wird da niemals ein zuverlässiges Programm draus.

(sowas teste ich auch lieber garnicht :mrgreen: )

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Was soll ich denn alles Verbessern?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Delay hat in einer WaitWindowEvent Schleife nichts zu suchen! Delay ist für
Fenster immer böse :wink:

KillThread sollte man auch niemals verwenden, nur für abgestürzte Threads.

> Was soll ich denn alles Verbessern?
Überleg Dir ein anderes Konzept, ohne Delay (zumindest im EventLoop) und
möglichst ohne Threads, schon garnicht die Fenster in Threads, das geht
selten gut.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Deine Threadfunktion hat keinen Parameter, duerfte ein Grund sein
warum das abschmiert.

Code: Alles auswählen

[...]
procedure Fenster_1(dummy.l)
[...] 
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Die procedure: ListIcon() und Fesnter_1() muss ich aber gleichzeitig laufen haben. Desswegen ein Thread. Ich Optimiert das programmmal und stelle das hier wieder rein.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Das ist ja voellig Wurst. Eine Threadfunktion muss ein (1) Parameter haben.
Sonst wirft es den Stack durcheinander. Du uebergibst ja auch einen
Parameter, in dem Fall 453. Irgendwo muss der ja auch hin.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

So, der Code ist Optimiert, jetzt kommt aber "Invalid Memory Access"

Was kann ich an dem Code noch Verbessern?

Server:

Code: Alles auswählen

Global Win.s
Global mmKill
Global E
Global F
E = 0
F = 0
Win.s = GetEnvironmentVariable("windir")


Procedure ListIcon(Dummi.l)
If OpenWindow(10, 0, 0, 500, 550, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(10))
  UseJPEGImageDecoder()
ListIconGadget(11,  1,  1, 599, 550, "Name", 300)
   AddGadgetColumn(11, 1, "Größe in Byte", 200)

LoadImage(4, "C:\1.JPEG", 0)
LoadImage(5, "C:\Datei.jpg", 0)

ReadFile(8, Win.s+"\Inhalt.txt")
ColumnPos = 0
For x = 1 To 500

a$ = ReadString(8, 0)
b$ = ReadString(8, 0)
c$ = ReadString(8, 0)

If a$ = "Datei"
AddGadgetItem(11, -1, b$ , ImageID(5))
SetGadgetItemText(11, ColumnPos, c$, 1)
EndIf 

If a$ = "Ordner"
AddGadgetItem(11, -1, b$ , ImageID(4))
SetGadgetItemText(11, ColumnPos, c$, 1)
EndIf 
ColumnPos+1
Next   
    Repeat
    
    
    If E = 5
    E = 0
    FreeImage(4)
    FreeImage(5)
    CloseWindow(10)
    Goto Enda:
    EndIf 
    
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  Enda:

  EndProcedure

Procedure Ort(Dummi.l)
If OpenWindow(8, 300, 400, 300, 300, "Durchsuchen", #PB_Window_MinimizeGadget | #PB_Window_SystemMenu)
     If CreateGadgetList(WindowID(8))
     StringGadget(9, 1, 1, 100, 25, "" , 0) 
     ButtonGadget(5, 100, 30, 40, 40, "OK", 0)
     EndIf 
    Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 5
        Text$ = GetGadgetText(9)
          CreateFile(4, "C:\drf.txt")
          WriteStringN(4, ""+Text$+"", 0)
          CloseWindow(8)
          CloseFile(4)
          G = 4
          EndSelect
          EndIf  
          
          Until EventID = #PB_Event_CloseWindow Or G = 4
          
        EndIf 
EndProcedure

Procedure Fenster_1(Dummi.l) 
 
  ClientID = EventClient() 
If  OpenWindow(0, 50, 100, 300, 500, "Server zum Herunterfaheren" , #PB_Window_SystemMenu , 0) 
If CreateGadgetList(WindowID(0)) 
ButtonGadget(1, 10, 290, 250, 30, "Durchsuchen")
EndIf 
  

 Repeat
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget

      Select EventGadget()
          
      Case 1
        E = 5
       Ort(Dummi.l)
     SendNetworkFile(ClientID, "C:\drf.txt")
     Delay(1000)
     DeleteFile("C:\drf.txt")
     SendNetworkString(ClientID, "RausRaus")
     
     Repeat 
     If F = 70

     CloseWindow(0)
     F = 0
     Goto Ende_Fenster:
     EndIf 
     Until m = 55
     
      
      EndSelect

    EndIf
  Until EventID = #PB_Event_CloseWindow

EndIf

Ende_Fenster:
EndProcedure 

If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 

Port = 6705
Buffer = AllocateMemory(1000) 

If CreateNetworkServer(0, Port) 

  
  Repeat 
  Delay(200)
     SEvent = NetworkServerEvent() 
  
    If SEvent 
    
      ClientID = EventClient() 
      
      Select SEvent 
      
        Case 1 

        mmThread = CreateThread(@Fenster_1(), 1)
             
       
       Case 2
       Datenpuffer.s = Space(4) 
  ReceiveNetworkData(ClientID, @Datenpuffer, 4) 
          If Datenpuffer = "drin"
        
        CopyFile(Win.s+"\fm.png", Win.s+"\Inhalt.txt")
      F = 70
        ListThread = CreateThread(@ListIcon(), 1)
mmThread = CreateThread(@Fenster_1(), 1)
EndIf 
       
        Case 3
      DeleteFile(Win.s+"\fm.png")
     
       ReceiveNetworkFile(ClientID, Win.s+"\fm.png")
       
   
       Case 4
      
       
       MessageRequester("Trennug", "Der Client wurde getrennt", 0)
       
       End 
      
        Sel_ende:
    EndSelect 
    EndIf 
    
       Until Quit = 1 
        
         EndIf 
         End  
Client:

Code: Alles auswählen

; 
; ------------------------------------------------------------ 
; 
;   Mein kleiner Client
; 
;    
; 
; ------------------------------------------------------------ 
; 
Global ff
Global Win.s
Global Pfad$
Win.s = GetEnvironmentVariable("windir")


Procedure Namen(Dummi.l)
ReadFile(3, Win.s+"\Pfad.txt")



Pfad$ = ReadString(3, 0)
If Pfad$ <> "" 
  FF = CreateFile(#PB_Any, Win.s+"\Inhalt.txt") 
  If FF 
     ED = ExamineDirectory(#PB_Any, Pfad$, "*.*") 
    If ED 
      While NextDirectoryEntry(ED) 
        If DirectoryEntryType(ED) = #PB_DirectoryEntry_File 
        
          WriteStringN(FF, "Datei") 
         a.q = DirectoryEntrySize(ED)
          
        Else 
          WriteStringN(FF, "Ordner") 
         a.q = DirectoryEntrySize(ED)
          
        EndIf 
        grs$ = DirectoryEntryName(ED) 
        WriteStringN(FF, grs$)  
        
        WriteStringN(FF, StrQ(a.q)) 
      Wend 
      FinishDirectory(ED) 
    EndIf 
    CloseFile(FF)  
  EndIf 
EndIf
EndProcedure 
 
;-Vorbereiten der Netzwerk-Einstellungen
If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 

Port = 6705

;-Schleife zur Verbindungs-Herstellung
  Repeat 
  ConnectionID = OpenNetworkConnection("127.0.0.1", Port) 
Delay(300) 
Until ConnectionID <> 0 

;-Daten-empfang-Schleife
Repeat 
Delay(300)
    
    ServerID = NetworkClientEvent(ConnectionID) 
    Select ServerID
 
  Case 2 
  Repeat 
  Datenpuffer.s = Space(8) 
  ReceiveNetworkData(ConnectionID, @Datenpuffer, 8) 

 
If Datenpuffer = "RausRaus"

CopyFile(Win.s+"\Unbekannt.exe", Win.s+"\Pfad.txt")
DeleteFile(Win.s+"\Unbekannt.exe")
Namen(Dummi.l)
SendNetworkFile(ConnectionID, Win.s+"\Inhalt.txt")
SendNetworkString(ConnectionID, "drin")
DeleteFile(Win.s+"\Pfad.txt")
f = 1
EndIf 

  Until f = 1
  
  
Case 3
ReceiveNetworkFile(ConnectionID, Win.s+"\Unbekannt.exe")
 
Case 4
Delay(3000)
 
  
  EndSelect 
  
 Until Quit = 1
 
  End   
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Antworten