Accueil > Forum > > > > Comment rédémarer un thread automatiquement quand il se termine.
Comment rédémarer un thread automatiquement quand il se termine.
samedi 22 août 2009 à 00:15:48 |
Comment rédémarer un thread automatiquement quand il se termine.

jerem3000
|
Bonjour,
Donc tous est dans le titre :
Méme si je pense que cela n'est pas trés propre je ne vois pas d'autre solution a mon probléme.
Voici mon thread si vous en avez besoin :
Code C/C++ : DWORD WINAPI EnvoieEmail ( LPVOID IpvThreadParam )
{
email();
Sleep(60000);
return 0;
}
HANDLE hThreads [ 2 ] ;
DWORD dwThreadId ;
DWORD dwThreadParam = 1 ;
hThreads [ 1 ] = CreateThread ( NULL, NULL, EnvoieEmail, &dwThreadParam, 0, &dwThreadId ) ;
CloseHandle ( hThreads [ 1 ] ) ;
Voila en espérant que cela soit possible.
merci d'avance
jérémy
|
|
samedi 22 août 2009 à 02:30:49 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12
|
Code C/C++ :
DWORD WINAPI EnvoieEmail ( LPVOID IpvThreadParam )
{
lbl_Loop:
email();
Sleep(60000);
goto lbl_Loop;
return 0;
}
ce qui ne répond pas vraiment à ta question mais a l'effet recherché;
ou bien :
Code C/C++ :
DWORD WINAPI EnvoieEmail ( LPVOID IpvThreadParam )
{
email();
Sleep(60000);
return 0;
}
// fonction principale
lbl_Loop:
HANDLE hThread=CreateThread(...);
if(hThread)
{
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
}
goto lbl_Loop;
|
|
samedi 22 août 2009 à 04:04:30 |
Re : Comment rédémarer un thread automatiquement quand il se termine.
|
samedi 22 août 2009 à 11:12:17 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12
|
Si tu as utilisé la première solution, faut pas que la fonction principale se termine avant les autres threads sinon ils sont tous arrêtés (le thread principal appelle ExitProcess()); d'où l'utilisation de WaitForSingleObject() et consorts, que tu peux mettre en fin de procédure éventuellement.
Bon, je ne sais pas si cela explique ton problème, faudrait mettre un peu plus de code.
Quant à goto, beaucoup de gens refusent de l'utiliser dans un code en C, soi-disant que ça engendre un manque de visibilité etc... Moi je crois que c'est juste à cause du Basic
En l'occurence il y avait d'autres possibilités pour une boucle infinie :
Code C/C++ :
Code C/C++ :
|
|
samedi 22 août 2009 à 12:46:08 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

jerem3000
|
Oups j'ai complètement oublier de coller ma fonction mail.
J'ai déjà essayer une boucle infinie avec while(1) mais cela ne marcher pas. J'ai l'impréssion que la seconde fois que la fonction email est lancer elle ne se termine pas je ne vois pas trop pourquoi cela fait sa.
Code C/C++ : #define TAILLE_MAX 10000
#include <winsock.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <cstdio>
#include <sstream>
#include <fstream>
#pragma comment(lib,"ws2_32.lib")
SOCKET to_server_socket = 0;
char * server_name;
int port = 25;
char destinataire[120] = "RCPT To: <";
char sender[120] = "MAIL From: <";
char * exp;
char * dest;
char * sujet;
char * message;
char buffer[15];
char body[1100] = "Subject: ";
void bcopy( void * source, void * destination, int size )
{
char * src = ( char * ) source;
char * dst = ( char * ) destination;
for( int i=0; i<size; i++ )
dst[i] = src[i];
}
void bzero( void * destination, int size )
{
char * dst = ( char * ) destination;
for( int i=0; i<size; i++ )
dst[i] = 0x00;
}
void Process( char * buffer )
{
Sleep( 1000 );
int size = strlen( buffer );
int retVal = send( to_server_socket, buffer, size, 0 );
char buf[ 1024 ];
buf[0] = 0x00;
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );
}
int email()
{
std::string contenue = "";
FILE* fichier = NULL;
char chaine[TAILLE_MAX] = "";
fichier = fopen("C:\\readme.txt", "r");
if (fichier != NULL)
{
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
{
contenue += chaine;
}
fclose(fichier);
}
//FILE* fichier2 = NULL;
//fichier2 = fopen("C:\\readme.txt", "w+" );
//fclose(fichier2);
const char *CstStr2 = contenue.c_str ();
if (contenue == "")
{
return 0;
}
if (strcmp(CstStr2,buffer) == 0) {
exit( -1 );
}
int not = 0;
unsigned long ioctl_blocking = 1;
/*cout<<"Entrez le nom du serveur smtp ou son ip\n";
cin>>server_name;
cout<<"Entrez l'adresse email de l'expediteur\n";
cin>>exp;
cout<<"\nEntrez l'adresse email du destinataire\n";
cin>>dest;
cout<<"\nEntrez le sujet du mail\n";
cin>>sujet;
cout<<"\nEntrez votre message\n";
cin>>message;*/
server_name = "smtp.orange.fr";
exp = "******";
dest = "*****";
sujet = "le sujet";
strcat(sender,exp);
strcat(sender,">\r\n");
strcat(destinataire,dest);
strcat(destinataire,">\r\n");
strcat(body,sujet);
strcat(body," \r\n\r\n ");
strcat(body,CstStr2);
strcat(body," \r\n.\r\n");
WSADATA wsaData;
if( int err = WSAStartup( 0x0101, &wsaData ) )
{
exit( -1 );
}
struct sockaddr_in serverSockAddr; // addresse de la socket
struct hostent * serverHostEnt; // description du host serveur
long hostAddr; // addr du serveur
bzero( &serverSockAddr, sizeof( serverSockAddr ) ); // initialise a zero serverSockAddr
// converti l'adresse ip 9.100.1.1 en entier long
hostAddr = inet_addr( server_name );
if( ( long ) hostAddr != ( long ) -1 )
bcopy( &hostAddr, &serverSockAddr.sin_addr, sizeof( hostAddr ) );
else // si on a donne un nom
{
serverHostEnt = gethostbyname( server_name );
if ( serverHostEnt == NULL )
{
exit( 0 );
}
bcopy( serverHostEnt->h_addr, &serverSockAddr.sin_addr, serverHostEnt->h_length );
}
serverSockAddr.sin_port = htons( port ); // host to network port
serverSockAddr.sin_family = AF_INET; // AF_*** : INET=internet
// creation de la socket
to_server_socket = socket( AF_INET, SOCK_STREAM, 0 );
if ( to_server_socket < 0)
{
exit( 0 );
}
setsockopt(to_server_socket, SOL_SOCKET, SO_DONTLINGER, (char *) ¬, sizeof(not));
// requete de connexion
if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr,
sizeof( serverSockAddr ) ) < 0 )
{
exit( 0 );
}
ioctlsocket ( to_server_socket, FIONBIO, &ioctl_blocking );
char buf[ 1024 ];
buf[0] = 0x00;
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );
Process( "EHLO Toto\r\n" );
Process( sender ); // mail de l'expediteur
Process( destinataire ); // mail du destinataire
Process( "DATA\r\n" );
Process( body );
Process( "QUIT\r\n" );
/* fermeture de la connection */
shutdown( to_server_socket, 2 );
contenue.erase();
closesocket( to_server_socket );
return 0;
}
jérémy
|
|
samedi 22 août 2009 à 14:51:25 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12
|
Réponse acceptée !
Tu as toute une série de strcat(sender,exp) etc...
La première fois pas de problème... mais tu ne réinitialises pas ces variables (elles sont GLOBALES) donc à chaque fois que tu appelles la fonction t'ajoutes un truc derrière et forcément ça veut plus rien dire.
Voilà déjà un point à corriger, peut-être autre chose après.
Ensuite, bon, c'est pas super joli...
Tu utilises l'API (CreateThread etc...) donc autant le faire pour tout, notamment la lecture de fichier :
fonctions utiles CreateFile, GetFileSize, ReadFile...
Ca serait même plus élégant en l'occurence de passer par le file mapping :
CreateFileMapping et MapViewOfFile pour récupérer directement un pointeur sur le texte à transmettre, sans s'embêter à devoir le copier.
|
|
samedi 22 août 2009 à 15:57:16 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

jerem3000
|
elle sont toute réinitialiser car on relit le fichier et on met le contenue dans CstStr2 donc vu que sa envoie comme contenue CstStr2 il ne devrait pas y avoir de problème.
toute les variable sont initialiser ou une valeur et défini avant l'envoie.
mais le fichier texte si il est modifier entre 2 envoie ne change pas il n'y a rien qui se rajoute.
je viens quand méme de modifier par :
Code C/C++ : char destinataire[120] = "RCPT To: <";
char sender[120] = "MAIL From: <";
char * exp = "";
char * dest = "";
char * sujet = "" ;[del][/del]
char * message = "";
char buffer[15] = "";
char body[1100] = "Subject: ";
et cela na rien changer.
Cela est mon premier programme donc que cela ne soit pas jolie pour l'instant c pas trop grave je corrigerai sa quand il marchera car la j'en est besoin rapidement
jérémy
|
|
samedi 22 août 2009 à 17:05:44 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12
|
Oui le problème c'est sur les variables sender, destinataire...
c'est celles-ci qui devraient être initialisées en début de fonction; regarde un peu leur contenu en cours d'exécution (tu peux les afficher dans la console par ex.)...
|
|
lundi 24 août 2009 à 16:14:28 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

jerem3000
|
Tu avait raison cela venait bien de sa. merci beaucoup
jérémy
|
|
vendredi 4 septembre 2009 à 15:39:11 |
Re : Comment rédémarer un thread automatiquement quand il se termine.

magicientarik
|
bonjour,
si vous pouvez m'aider, je veux developper un thread qui lit à partir d'un fichier txt ligne par ligne avant d'inserer la ligne dans une BDD, pour le moment ce que je cherche c'est de créer un thread de lecture de fichier txt en C++ sous windows.
Merci d'avance
Tarik
|
|
Cette discussion est classée dans : thread, automatiquement, dword, hthreads, rédémarer
Répondre à ce message
Sujets en rapport avec ce message
Prob de thread [ par sebastienbro ]
Bonjour, j'ai un problème avec des thread, je n'arrive pas a en créer un :(Voici mon code : HANDLE hThread1;DWORD dwThreadId1;DWORD WINAPI T
[API Win32 sans MFC] Lecture port série: thread bloqué [ par nitrique ]
Bonjour à tous, Je lis des données dès qu'elle arrivent sur le port COM avec la fonction WaitCommEvent. Pour éviter de figer l'application, j'util
Problème de Thread [ par F0ra ]
bonjourje réalise une application en openGl, et j'ai besoin d'un Threadpourquoi mon Thread ne s'exécute pas ?merci beaucoup@+ #include "main.h"DWORD W
thread et paramètres [ par sena ]
sujet : thread et paramètresbonjour,voila j'ai fait un petit programme de test pour l'éxcution de thread.je souahiterais faire la même chose en passan
thread qui ne se termine pas ! [ par gdpasmini ]
Hello !!j'ai un petit probleme. je crée des threads dans un progamme C sous visual c++ express edition sans MFC. Mais voila, je n'arrive pas a les arr
Redirection sortie standard processus [ par bouba ]
Bonjour, j'ai un programme qui créer un nouveau thread avec la fonction ShellExecute de l'API Win32 afin de lancer un exécutable. Le thread ainsi lanc
probleme de pointeur et de thread?? [ par glycefr ]
Bon jours,Voila j'essaie de faire un petit programe afin de me familiariser avec les thread... Afin de pouvoire passer des parametres a mon thread je
thread [ par baby3378 ]
bonjours a tous, je sais que ce type de question fut posé maintes et maintes fois sur le forum mais je tente quand même ma chance. Voila, j'ai fait u
Difference entre DWORD et unsigned int [ par mrous ]
Bonjour,je crois que j'ai tt dit ds le titre, je voudrais savoir quelle est la difference entre DWORD et un unsigned int? Il me semble que c la meme c
Thread [ par diablo31170 ]
Salut à tous,Comme le titre l'indique, je vais parler de Thread sous Linux en C++.Mon problème est de permettre l'affichage de l'horloge en meme temps
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|