Bonjour, je vous explique tout d'abord mon programme:
Mon programme main lance deux threads, un pour lire dans un fichier, il envoit ensuite la ligne dans une ''zone de transit'', et l'autre thread extrait, de la zone de transit, la ligne et l'écrit ensuite dans un autre fichier. J'ai un erreur à l'exécution et je ne comprend pas pourquoi:
(je sais que ça fait beaucoup de code, mais mon erreur est exactement dans ma classe mutex (2ieme bloc de code), dans mon WaitForSingleObject(m_Mutex,INFINITE); le déboggeur me lance ceci: Unhandled exception at 0x0040187a in TP2_1(2005).exe: 0xC0000005: Access violation reading location 0x00000020.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <iostream> // cout, endl #include "Lecteur.h" #include "Typographie.h" unsigned long __stdcall Lecture (void*); unsigned long __stdcall Typographe (void*); int main() { Lecteur oLecture; HANDLE hLecture; HANDLE hTypographe; hLecture = ::CreateThread (0,0, Lecture, &oLecture,0,0); hTypographe = ::CreateThread (0,0, Typographe, 0,0,0); HANDLE LesHandles [] = { hLecture, hTypographe }; WaitForMultipleObjects (2, LesHandles, TRUE, INFINITE); ::CloseHandle (hLecture); ::CloseHandle (hTypographe); } unsigned long __stdcall Lecture (void* pLecture) { Lecteur *p = reinterpret_cast<Lecteur *> (pLecture); p->LireFichier(); return 0; } unsigned long __stdcall Typographe (void* pTypographe) { Typographie *p = reinterpret_cast<Typographie *> (pTypographe); p->Ecrire(); return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #ifndef MUTEX_H #define MUTEX_H #include <windows.h> class Mutex { HANDLE m_Mutex; public: Mutex () throw() :m_Mutex(::CreateMutex(0,FALSE,0)) { } ~Mutex() throw () { if (m_Mutex) ::CloseHandle (m_Mutex); } void Obtenir () const throw() { ::WaitForSingleObject(m_Mutex,INFINITE); } void Relacher () const throw() { ::ReleaseMutex (m_Mutex); } }; #endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #ifndef AUTOVERROU_H #define AUTOVERROU_H #include "Mutex.h" class Autoverrou { Mutex &m_Mutex; public: Autoverrou (Mutex &m) throw() :m_Mutex(m) { m_Mutex.Obtenir(); } ~Autoverrou () throw() { m_Mutex.Relacher(); } }; #endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 // Zone de transit entre le lecteur et le décorateur #include <string> using std::string; #include "Mutex.h" #include "Autoverrou.h" class ZoneTransit { string m_Texte; Mutex m_Mutex; string sNomFichier_; public: string Extraire () { Autoverrou av (m_Mutex); string temp = m_Texte; m_Texte.clear (); return temp; } void Ajouter (const string &s) { Autoverrou av(m_Mutex); m_Texte += s; } void SetNomFichier(string sNomFichier) { sNomFichier_ = sNomFichier; } string GetNomFichier() { return sNomFichier_; } };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <fstream> #include <iostream> #include <string> using namespace std; class Typographie { ZoneTransit oZone; public: Typographie() { } ~Typographie() { } void Ecrire() { ofstream oFichier; string sNomFichier = "source.html"; oFichier.open(sNomFichier.c_str()); oFichier << "<HTML><HEAD><TITLE>Source</TITLE></HEAD><BODY>" + oZone.Extraire() + "</BODY></HTML>"; } };
Partager