Problème de CallFunctionFast & Thread (..encore et encor

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Problème de CallFunctionFast & Thread (..encore et encor

Message par Flastick »

Bonsoir à tous !

Je n'ai jamais fait de programme threadé auparavant, et je m'y suis mis, mais j'ai quelques soucis !

J'ai essayé de faire ça comme thread (en gros) :

Procedure ThreadP(Valeur)
repeat
delay(2000)
CallFunctionFast(*com_write, temp)
forever
EndProcedure

Mais le CallFunctionFast ne fait pas ce qu'il doit faire. Le programme semble totalement ignorer l'instruction. Pourtant si je décharge la lib alors que le thread tourne toujours, il bug quand-même ..!) Et sans le thread, ma fonction marche superbement bien.

En fait, même les CallFunctionFast qui ne sont pas éxécutées depuis le thread ne fonctionnent plus lorsque j'active le thread.


(Evidemment le CallFunctionFast est très lent pour mon cas(écriture sur le port série et parallèle) et doit être appelé très souvent, voilà pourquoi j'ai fait un thread)

Ce n'est pas possible de faire un appel de fonction externe depuis un thread ?!?

Merci beaucoup pour votre aide,

Flavien
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

tu a essayé avec un prototype ?
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Message par Flastick »

Ah ?!??

Tiens, je viens de découvrir ce qu'est un prototype. Je ne connaissais pas cette fonctionnalité.

J'essaie et je vous redis ..!
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Message par Flastick »

Ben non ça ne marche pas.. c'est un vrai bug alors ?!?

Quelqu'un utilise un callfunction dans un thread qui fonctionne ?!?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tu as compilé l'exe en activant la gestion des Threads ?

Avant de compiler, tu vas dans les options du compilateur et tu coches la boite "Activer la gestion des Threads" puis tu compiles.


Si tu l'as fait alors je ne vois pas.
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Je viens de tester ton cas :

Code : Tout sélectionner

Global hThread.l, kill_thread.l
Global cnt.l

Procedure Foo()
  cnt + 1
  Debug cnt  
EndProcedure

Procedure ThreadP(Value.l)

  Repeat
    If kill_thread = 1
      Break
    EndIf
    Delay(1000)
    CallFunctionFast(@Foo())
  ForEver
EndProcedure

kill_thread = 0
hThread = CreateThread(@ThreadP(), 0)

If OpenWindow(0, 0, 0, 230, 90, "Blah", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   Repeat
     Event = WaitWindowEvent()    
   Until Event = #PB_Event_CloseWindow
   kill_thread = 1
 EndIf
Pas de problème.
"Qui baise trop bouffe un poil." P. Desproges
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Message par Flastick »

Bizarre, ton code marche très bien chez moi, mais celui-ci pas

Il a besoin de la dll Port.dll (disponible ici :
http://www.dll-files-download.com/P/200 ... 11969.html )

et il envoie des données sur le port série. Chez moi là il ne marche pas,
mais si je mets

Code : Tout sélectionner

;hThread = CreateThread(@ThreadP(), 0)
ThreadP(0)
alors je reçois effectivement mes données.. qu'en pensez-vous ?

Code : Tout sélectionner


Global hThread.l, kill_thread.l

Global *com_write
Global *com_open


Procedure Init()

  OpenLibrary(1, "PORT.DLL")
  
  *com_open = GetFunction(1,"OPENCOM")
  *com_write = GetFunction(1,"SENDBYTE")
  
  texte$ = "COM1: baud=1200 data=8 parity=N stop=1"
  Ouvrir = CallFunctionFast(*com_open, texte$)
  
EndProcedure


Procedure ThreadP(Value.l)

  Repeat
    Delay(1000)
    CallFunctionFast(*com_write, 100) ;Envoie l'octet 100 sur le port série
  ForEver
EndProcedure




kill_thread = 0
Init()
hThread = CreateThread(@ThreadP(), 0)

;ThreadP(0)

If OpenWindow(0, 0, 0, 230, 90, "Blah", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   Repeat
     Event = WaitWindowEvent()   
   Until Event = #PB_Event_CloseWindow
   kill_thread = 1
 EndIf 


[/code]
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Ton code fonctionne bien chez moi, en tout cas, ça ne plante pas.
Bon, le port série est désactivé dans le bios (je peut pas reboot la) mais je récupère bien l'adresse de la fonction donc elle est appelée, pas de plantage.
J'ai pris la DLL ici (ton lien ne fonctionne pas)
Je serais toi, j'utiliserais les fonctions natives de PB, elles sont portable qui plus est :)
"Qui baise trop bouffe un poil." P. Desproges
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Message par Flastick »

Ah désolé pour le lien

Chez moi aussi, il ne bug pas, mais les données ne sont pas envoyées.
J'utilise un microcontroleur et celui-ci ne reçoit pas de données quand le thread est activé.

J'en ai donc déduit que la fonction ne s'éxécutait pas. Mais effectivement, si elle renvoie une valeur c'est sûrment un problème avec la fonction.. Je ne connais pas assez pour dire. Je pensais que c'était un tout petit problème venant de moi en fait.

Hehe j'aimerais bien mais y-a-t'il des fonctions PB qui gèrent le port série ? J'ai pas vu dans l'aide en tout cas.

Mais ç'est pas grave; pour faire mon thread, j'ai créé deux éxécutables, que je fais communiquer par winsock..je sais, j'ai honte :D mais ça marche super bien.

Je vous remercie beaucoup pour vos réponses en tout cas !

Flavien
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Salut,
Tu peux utiliser un mutex juste pour voir, je pense qu'étant donnée que tu envoies des données volatiles, il peut y avoir un problème à ce niveau.
Concernant le support du port série, c'est dans la lib SerialPort.
"Qui baise trop bouffe un poil." P. Desproges
Répondre