[WD16] Problèmes Thread et API
Le
VincentBarre
Bonjour,
J'ai un souci avec les Thread et les API.
Je m'explique car c'est un peu compliqué :
J'ai fait une application serveur qui fait appel à une DLL que j'ai
écrite en Visual C++, je lui passe deux chaines, une en entrée et une
en retour qui sont envoyé vers un service. Si je fait passer des
données DEPUIS la fenêtre du serveur, tout ce passe bien, mais c'est
pas le but du système.
Dans ce serveur, j'ai écrit des fonctions de transfert pas socket (pas
celle de Windev qui sont trop lente), mais je passe par la DLL
wsock32.dll, ces fonction sont dans des thread et c'est là que ça
marche plus.
Si je fait passer ces même données par un client, le serveur récupè=
re
bien ces données et les envoi à la DLL VC++, mais celle ci me retourne
une erreur. Hors en plaçant des traces/log partout (Serveur et DLL VC+
+), les valeurs des chaines sont bonnes. J'ai essayé de mettre les
variables passé à la DLL VC++ en global, c'est pareil :-(
Par contre, si je ne met pas la réception socket en thread, ça marche,
mais, la réception (accept,recv de wsock32.dll) est bloquante et donc
bloque le programme pour d'autres taches.
Bon je ne sais pas si je me suis bien fait comprendre, mais si
quelqu'un à une idée, je suis preneur, ça fait deux jour que je
galère.
Merci d'avance
Vincent
J'ai un souci avec les Thread et les API.
Je m'explique car c'est un peu compliqué :
J'ai fait une application serveur qui fait appel à une DLL que j'ai
écrite en Visual C++, je lui passe deux chaines, une en entrée et une
en retour qui sont envoyé vers un service. Si je fait passer des
données DEPUIS la fenêtre du serveur, tout ce passe bien, mais c'est
pas le but du système.
Dans ce serveur, j'ai écrit des fonctions de transfert pas socket (pas
celle de Windev qui sont trop lente), mais je passe par la DLL
wsock32.dll, ces fonction sont dans des thread et c'est là que ça
marche plus.
Si je fait passer ces même données par un client, le serveur récupè=
re
bien ces données et les envoi à la DLL VC++, mais celle ci me retourne
une erreur. Hors en plaçant des traces/log partout (Serveur et DLL VC+
+), les valeurs des chaines sont bonnes. J'ai essayé de mettre les
variables passé à la DLL VC++ en global, c'est pareil :-(
Par contre, si je ne met pas la réception socket en thread, ça marche,
mais, la réception (accept,recv de wsock32.dll) est bloquante et donc
bloque le programme pour d'autres taches.
Bon je ne sais pas si je me suis bien fait comprendre, mais si
quelqu'un à une idée, je suis preneur, ça fait deux jour que je
galère.
Merci d'avance
Vincent

Poser une question


En fait, c'est une histoire d'appel de la même DLL dans des thread
différents, je n'ai pas pu mettre ma DLL en mode single-thread
(safemode), donc je suis obligé de l'initialiser et l'appeler dans le
même thread. Je vais donc faire l'inverse, mettre la gestion de la
fenêtre dans un thread...
@+
Vincent
Vérifie que la fonction ThreadMode(threadSectionCritique) soit bien
dans le code d'ouverture du projet.
Eric.
c'est quoi ton histoire de single thread ?
je fait des dll en c++ et j'ai aucun soucis avec les threads.
Il faut juste ne pas utiliser de globale mais une structure par thread
que tu déclare dans la fonction principale du thread.
Et coté windev, comme dit précédemment, ne pas utiliser la gestion auto
des sections critiques
Si tu commence à mettre des affichages dans des thread en windev, ca va
se compliquer franchement.
si tu t'en sors toujours pas avec les thread, utilise la fonction
select() pour les sockets
Comme ca tu les passes en non bloquant, et le select() te permet de
savoir où tu en es.