Gestion des threads - Error!

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Gestion des threads - Error!

Message par Jacobus »

Si quelqu'un a une idée sur la question suivante.
Dans les options de compilation j'ai voulu activer la gestion des Threads pour un prog qui en utilise plusieurs (jamais en même temps) mais aussi 3 timers tournant eux en même temps.
J'ai eu la l'agréable surprise suivante en compilant :
POLINK: error:Unresolved external symbol '_PB_StringBasePosition'.
POLINK: fatal error: 1 unresolved external(s)
Or si on suit l'aide de PB, il est plus que préférable de cocher cette option pour les progs utilisant les threads. Sachant que sans cette option cochée l'appli tourne très bien :? Sauriez d'où peut bien venir ce symbol '_PB_StringBasePosition'
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme

Message par Anonyme »

Aucune idée , as tu du code a nous faire voir ?
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Hélas non, le code fais 15000 lignes et prendre un extrait ne rendrait pas le même effet. Je viens de me rendre compte que j'en ai un du même genre de (4000 lignes) qui ne plante pas dans les mêmes conditions (multi-threadé).
Je suppose qu'il y a une commande mal placée dans un thread. Il faut que j'essaye de la trouver.
M'enfin si une idée vous vient n'hésitez pas à m'en faire part.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme

Message par Anonyme »

y a t'il de l'asm dans ton code ?
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

No, pas d'asm. Comme j'y connais rien j'évite...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Il me semble mais je ne suis plus très sur que c'est un pointeur que PB utilise pour connaître la position courante de la chaîne dans son buffer mais je ne sais plus si c'est encore comme ça que cela fonctionne. L'erreur vient que ce pointeur n'est pas déclaré dans la datasection certainement dans une de celle propre au thread (ou à chaque thread ?). Tu devrais essayer un code multi-thread simple avec des chaînes pour voir si tu peux reproduire le problème pour l'envoyer à Fred ou tu peux envoyer tes 15000 lignes à fred en toute confiance ou alors le code asm (?), faudrait voir avec lui mais c'est un bug.
Anonyme

Message par Anonyme »

Bon , ben reprennons le questionnaire :D

Tu as combien de threads ?
Que font ils ?
Te sert tu des mutex ?
essaye tu d'effacer un "string" via freememory()?
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Bon j'ai pu déterminé LE Thread moqueur et LA procédure complice. Seulement il faut que je dépouille le tout (je suis pas couché) car il y a des appels à plusieurs procédures qui font appel elles mêmes à des API.

Je ne me sers pas de Mutex, les threads étant alternatifs. Il se peut en effet qu'une chaîne effacée en cours soit responsable.

Déjà je sais d'où ça vient, je commençais à baliser sec :oops:
Je vous tiens au courant de mes investigations...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tu devrais en parler dans les bug sur le forum anglais pour voir ce que Fred en pense. Pour moi c'est un bug car la déclaration de ce pointeur n'est pas faite (oubli) ou alors c'est une problème de code qui engendre cette erreur mais à ce moment là le compilateur devrait signaler le problème.

Peut-être en ajoutant dans le thread qui cause problème, une déclaration simple d'allocation de chaîne vide en début de thread (a$ ="" par exemple) pour voir si ça compile (ça obligera peut-être le compilateur à faire la déclaration de ce pointeur).
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

J'ai essayé de modifier plusieurs éléments et le bean's persiste. Ca compile qu'en désactivant la gestion des threads. je vais tenter un code d'exemple avec ces procédures pour voir si je peux isoler le problème.
Je voudrais être sûr que ce n'est pas un mauvais codage avant de signaler un bug, mais tu as raison Denis sur le debugger, il devrait signaler que ça coince, le bougre :twisted:
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Voici le code du problème isolé.
Récupère les processus courants et affiche un listing.
1/ Ne pas cocher la gestion des threads dans les options de compilation = ça fonctionne.
2/ Cocher la gestion des threads dans les options de compilation = ça fonctionne puis ça plante! Différemment selon l'humeur. WHY??
Attention quand ça plante, arrêter le prog avec la tête de mort (ide pb)

Code : Tout sélectionner

;-Debut
Enumeration 
#WIN_PROC
#ListProcessus
#Btn_ScanProcess
EndEnumeration

;structure nécessaire à la recherche des process
Structure PROCESSENTRY33 
  dwSize.l 
  cntUsage.l 
  th32ProcessID.l 
  th32DefaultHeapID.l 
  th32ModuleID.l 
  cntThreads.l 
  th32ParentProcessID.l 
  pcPriClassBase.l 
  dwFlags.l 
  szExeFile.b[#MAX_PATH] 
EndStructure 
;structure nécessaire pour obtenir l'usage mémoire
Structure PROCESS_MEMORY_COUNTERS
  cb.l
  PageFaultCount.l
  PeakWorkingSetSize.l
  WorkingSetSize.l
  QuotaPeakPagedPoolUsage.l
  QuotaPagedPoolUsage.l
  QuotaPeakNonPagedPoolUsage.l
  QuotaNonPagedPoolUsage.l
  PagefileUsage.l
  PeakPagefileUsage.l
EndStructure

Procedure ColorLines_Listicon(Listing.l); colorise une ligne sur deux dans la listicon
 
 NbLinesImpair = CountGadgetItems(Listing.l) - 1
 
 For NbElementImpair = 0 To NbLinesImpair Step 2
  SetGadgetItemColor(Listing.l,  NbElementImpair, #PB_Gadget_BackColor,  RGB(225, 228, 231), -1)
 Next 
 
 For NbElementImpair = 1 To NbLinesImpair Step 2
  SetGadgetItemColor(Listing.l,  NbElementImpair, #PB_Gadget_BackColor,  RGB(181, 188, 190), -1)
 Next
 
EndProcedure

Procedure.l ExtractSmallIconFile(IconPath.s) ; 16*16
  ; Cette procedure permet d'extraire l'ID de l'icône 16*16 associé au type de fichier ou au dossier dont l'adresse est IconPath 
  SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON) 
  ProcedureReturn InfosFile\hIcon 
EndProcedure

ProcedureDLL GetPidProcess(Name.s) 
  Name.s=UCase(Name.s)
  Recherche=0
  If OpenLibrary(0, "Kernel32.dll")     
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot") 
    ProcessFirst           = GetFunction(0, "Process32First") 
    ProcessNext            = GetFunction(0, "Process32Next")    
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found      
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)       
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0) 
      If Snapshot        
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process) 
        While ProcessFound 
          Nom.s=UCase(PeekS(@Process\szExeFile, -1, #PB_Ascii))
          Nom=GetFilePart(Nom)
          If Nom=Name 
            Recherche =1 
            PID=Process\th32ProcessID
          EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)          
        Wend 
      EndIf       
      CloseHandle_(Snapshot) 
    EndIf     
    CloseLibrary(0) 
  EndIf  
  ProcedureReturn PID
EndProcedure

ProcedureDLL.s PidToFileName(PID.l) 
  
  hProcess.l    = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, #False, PID) 
  ProcessPath.s = Space(255)   
  If OpenLibrary(0,"PSAPI.DLL") 
    *F=GetFunction(0,"GetModuleFileNameExA") 
    If *F 
      CallFunctionFast(*F,hProcess,0,@ProcessPath,255) 
    Else  
      CloseLibrary(0) 
      End 
    EndIf 
  Else 
    End 
  EndIf 
  ProcedureReturn ProcessPath 
  
EndProcedure

ProcedureDLL GetProcessMemory(PID.l)
 
  pmc.PROCESS_MEMORY_COUNTERS   
  hProcess.l  = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, #False, PID) 
   
  If OpenLibrary(0,"PSAPI.DLL")     
    *F=GetFunction(0,"GetProcessMemoryInfo") 
    If *F 
      CallFunctionFast(*F,hProcess,@pmc,SizeOf(pmc))    
       GetProcessusSize = pmc\WorkingSetSize               
    Else  
      CloseLibrary(0) 
      End 
    EndIf 
  Else 
    End 
  EndIf 
  
  ProcedureReturn GetProcessusSize 
  
EndProcedure

ProcedureDLL GetProcessPagefile(PID.l)
  
  pmc.PROCESS_MEMORY_COUNTERS  
  hProcess.l  = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, #False, PID) 
   
  If OpenLibrary(0,"PSAPI.DLL")     
    *F=GetFunction(0,"GetProcessMemoryInfo") 
    If *F 
      CallFunctionFast(*F,hProcess,@pmc,SizeOf(pmc))    
       GetProcessusPagefileUsage = pmc\PagefileUsage               
    Else  
      CloseLibrary(0) 
      End 
    EndIf 
  Else 
    End 
  EndIf 
  
  ProcedureReturn GetProcessusPagefileUsage 
  
EndProcedure

ProcedureDLL EnumProcessInit() 
  
  Static Initialised
  If Initialised=0
    Global NewList EnumProcessLList.s()
    Initialised=1
  Else
    ClearList(EnumProcessLList())
  EndIf
  
  If OpenLibrary(0, "Kernel32.dll") ;Vista et Xp  = C:\Windows\System32\Kernel32.dll"
    
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot") 
    ProcessFirst           = GetFunction(0, "Process32First") 
    ProcessNext            = GetFunction(0, "Process32Next") 
    
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found 
      
      Process.PROCESSENTRY32\dwSize = SizeOf(PROCESSENTRY32) 
      
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0) 
      If Snapshot 
        
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process) 
        While ProcessFound 
          Temp.s=PeekS(@Process\szExeFile) 
          If Temp<>"[System Process]"
            AddElement(EnumProcessLList())
            EnumProcessLList()= Temp
          EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process) 
          
        Wend 
      EndIf 
      
      CloseHandle_(Snapshot) 
    EndIf 
    
    CloseLibrary(0) 
  EndIf
  
  ResetList(EnumProcessLList())
  ProcedureReturn CountList(EnumProcessLList())
  
EndProcedure 

ProcedureDLL.s EnumProcess()
  
  Static Pointeur 
  If Pointeur >= CountList(EnumProcessLList())
    Pointeur=0
  Else
    SelectElement(EnumProcessLList(),Pointeur)
    Retour.s=EnumProcessLList()
    Pointeur+1
  EndIf
  
  ProcedureReturn Retour.s
  
EndProcedure

Procedure ListingProcess()

 Protected Templ.s,path.s,pid.l,size.s,Memory.s,PageFile.s
 EnumProcessInit()
; Title.s = Str(EnumProcessInit())+ " Processus détectés"
; SetGadgetItemText(#ListProcessus, -1, Title, 0)	
	Repeat
	  Templ = EnumProcess()
	  If Templ<>""
	   pid    = GetPidProcess(Templ)
	   path.s = PidToFileName(pid)		   
		   If path <>"" Or path<>"?"
		     If FileSize(path) > 0
		       size     = StrF(FileSize(path)/1024,2)+"  ko"
		       Memory   = Str(GetProcessMemory(pid)/1024)+"  ko"
		       PageFile = Str(GetProcessPagefile(pid)/1024)+"  ko"		              
			    Else 
			     size   = ""
			     Memory    = ""
			     PageFile = ""
			   EndIf 			  		    		    
		   EndIf    
    icon = ExtractSmallIconFile(Path)
		AddGadgetItem(#ListProcessus,-1,Templ +Chr(10)+ Str(pid) +Chr(10)+ size +Chr(10)+ Memory +Chr(10)+ PageFile +Chr(10)+ path ,icon)
	  EndIf 
	
	Until Templ=""
	ColorLines_Listicon(#ListProcessus)
	
EndProcedure


 ExamineDesktops()
  Largeur$ = Str(DesktopWidth(0))
  Hauteur$ = Str(DesktopHeight(0))
  WinX = 1014
  WinY = 718
  If Val(Largeur$)>1014 And Val(Hauteur$)>718
    FlagWin = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar|#PB_Window_Invisible
  Else 
    FlagWin = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget|#PB_Window_TitleBar|#PB_Window_Invisible
  EndIf 
  
If OpenWindow(#WIN_PROC,0,0,WinX,WinY,"Test" ,FlagWin)=0 Or CreateGadgetList(WindowID(#WIN_PROC))=0 
End 
EndIf 


ListIconGadget(#ListProcessus, 5, 5, 1004, 605, "Nom", 200,#PB_ListIcon_FullRowSelect) 
  AddGadgetColumn(#ListProcessus,1,"PID",50)
  AddGadgetColumn(#ListProcessus,2,"Taille fichier",100)
  AddGadgetColumn(#ListProcessus,3,"Mémoire utilisée",100)
  AddGadgetColumn(#ListProcessus,4,"Pagination",100)
  AddGadgetColumn(#ListProcessus,5,"Emplacement, chemin complet",400)
  
ButtonGadget(#Btn_ScanProcess,10,620,60,30,"Actualiser")
 GadgetToolTip(#Btn_ScanProcess,"Actualiser la liste en procédant à un nouveau scan")
    
  
ListingProcess()
HideWindow(#WIN_PROC,0)


Repeat 
 Event = WaitWindowEvent()    
  Select Event  
   Case #PB_Event_Gadget 
     Select EventGadget()   
	    
	  Case #Btn_ScanProcess
	    ClearGadgetItemList(#ListProcessus)
	      CreateThread(@ListingProcess(),0)
          
;-End    
  EndSelect  
 EndSelect  
 Until Event = #PB_Event_CloseWindow   
End
     
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

En apportant ces modifications, chez moi ça marche:

Procedure ListingProcess(lparam.l)

ListingProcess(0)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Bien vu nico. C'est vrai qu'en ajoutant une valeur ça à l'air de tenir le coup.
Reblème, une fois remis dans son contexte RE POLINK Errors! Argh!!
Bon je vais me coucher j'en ai marre :(
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

T'as vérifié que tous tes procédures thread avaient un paramètre?
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Oui, depuis que tu m'as indiqué cela j'ai illico modifié mes procédures de threads en conséquence. Ca me surprend quand même qu'une valeur soit obligatoire, même nulle, mais si on prend l'aide à la lettre alors en effet...

Mais j'ai trouvé d'où ça vient. Interférences entre UsersLibs. Il semble après mes tests qu'il s'agisse de PureZip de Gnozal qui pose problème. Je les ai toutes virées une à une en commençant par PBOSL puis les libs de Gnozal.
Je vais refaire d'autres tests pour être sûr.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre