Page 1 sur 1
Problème de CallFunctionFast & Thread (..encore et encor
Publié : dim. 14/déc./2008 17:45
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
Publié : dim. 14/déc./2008 19:37
par cha0s
tu a essayé avec un prototype ?
Publié : dim. 14/déc./2008 20:33
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 ..!
Publié : sam. 20/déc./2008 0:34
par Flastick
Ben non ça ne marche pas.. c'est un vrai bug alors ?!?
Quelqu'un utilise un callfunction dans un thread qui fonctionne ?!?
Publié : sam. 20/déc./2008 7:36
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.
Publié : sam. 20/déc./2008 9:51
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.
Publié : sam. 20/déc./2008 11:35
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
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]
Publié : sam. 20/déc./2008 15:30
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

Publié : sam. 20/déc./2008 18:18
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

mais ça marche super bien.
Je vous remercie beaucoup pour vos réponses en tout cas !
Flavien
Publié : sam. 20/déc./2008 18:51
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.