2010-11-08 29 views
1

J'ai essayé de rediriger la sortie standart (de Cout) à un fichier, à des fins de débogagerediriger la sortie standard vers un fichier en utilisant un fil multiple

std::ofstream traceFile; 
traceFile.open("c:/path/file.txt"); 
std::streambuf* fileBuff = traceFile.rdbuf(); 

std::cout.rdbuf(fileBuff); 

std::cout << std::unitbuff; 

std::cout << "disk is written\n"; 

Mais appeler Cout d'un nouveau thread faire le code coincé sur un mutex. (xmtx.c 39: _Mtxlock()).

Avez-vous une idée, comment je pourrais le résoudre?

Merci

Répondre

1

Ce example fonctionne très bien pour moi, tandis que votre cas de test ne fonctionne pas. Sur ma machine, votre code semblait libérer le fichier streambuf du fichier, alors que cet exemple le remplace avant que les destructeurs ne soient appelés.

+0

ouais, c'était stupide, parfois l'objet ofstream sort de sa portée avant le nouvel appel de thread std :: cout. Je pense que j'ai besoin de plus de sommeil. Je vous remercie – MiniScalope

0

Peut-être que vous devez réinitialiser streambuf cout à original.

std::ofstream traceFile; 
traceFile.open("c:/path/file.txt"); 
std::streambuf* fileBuff = traceFile.rdbuf(), *origBuf; 

origBuf = cout.rdbuf(); //Save cout's StreamBuf pointer 
std::cout.rdbuf(fileBuff); //Set cout's StreamBuf to file's StreamBuf pointer 

std::cout << std::unitbuff; 

std::cout << "disk is written\n"; 
cout.rdbuf(origBuf); //Reset cout's StreamBuf back to original 

De même, l'écriture simultanée dans le même fichier par plusieurs threads peut ne pas être autorisée. Cela peut être la raison de l'échec de l'acquisition de mutex.