Disk filler multi threading

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 806 fois - Téléchargée 25 fois

Contenu du snippet

petit programme qui remplit un disque dur avec des fichiers pleins de zéros!

la partie graphique n'est pas extraordinaire mais c'est la premiere fois que je code un programme en multithreading.

Source / Exemple :


#include <windows.h>
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <string>
#include <cmath>
#include <fstream>
using namespace std;

//Header declarations
long WINAPI WriteToDisk(int koko);
void gotoxy(int x, int y );
bool CheckIfAllFlase(void);
double WrittenData[10];
  HANDLE hThread[10];
  DWORD dwID[10];
  DWORD dwRetVal = 0;
  long double TotalData_d;
  DWORD TotalThread;
  long double TotalDataByThread;
  long double ActualWrittenBytes;
  long double LastActualWrittenBytes;
  string TempData;
  long double SizeOfTempData = 20971520;
  bool started[10];

int main(void){
	ActualWrittenBytes = 0;
	LastActualWrittenBytes = 0;
  //int DataByThread;
  cout << "What space would you want to fill in Bytes ( more than 1024 * number of Thread ):";
	cin >> TotalData_d;
	do{
		cout << "How much Thread will be running [1 to 10]:";
		cin >> TotalThread;
	}while(TotalThread >= 11 || TotalThread == 0);
	TotalDataByThread = ceil(TotalData_d / TotalThread);

	
	cout << endl << "Each Thread will have to generate " << setprecision(25) << TotalDataByThread << " Bytes of Data";
	cout << endl << endl << "Generating Temporary Data: 1 048 576 zeros... (1MB)";
	for(int i=0; i< 9; i++)
		started[i] = false;
	for(int i=1; i< SizeOfTempData+1; i++)
		TempData.insert(i-1,"0");
	cout << endl << endl << "Temporary Data Successfully created Are you Ready to fill your Disk?";
	cout << endl << "Press any key to continue or close this window";
	_getch();

	system("cls");
	cout << "Starting Processes...";
	cout << endl;
	for(int i=0; i < int(TotalThread); i++){
		hThread[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WriteToDisk,NULL,0,&dwID[i]);
	cout << "\t Thread #" << i+1 << " is running..." << endl;
	}
	do{
		gotoxy(0,0);
		ActualWrittenBytes = 0;
		for(int i=0; i< 9; i++)
			ActualWrittenBytes += WrittenData[i];
		//system("cls");
		cout << "Starting Processes..." << endl;
		for(int i=0; i< int(TotalThread); i++){
			cout << "\t Thread #" << i+1 << " is running...";
			cout << WrittenData[i] << " Bytes" << endl;
		}
		cout << endl << "Writing Speed : " << ceil((ActualWrittenBytes - LastActualWrittenBytes) / ( 1024) / (1024)) << " MB/s";
		cout << endl << "Progress : " << ceil((ActualWrittenBytes / TotalData_d) * 100) << "%";
		cout << endl << "Total Written Data : " << ceil(ActualWrittenBytes / 1024 / 1024) << " MB on " << ceil(TotalData_d /1024 /1024) << " MB";
		LastActualWrittenBytes = ActualWrittenBytes;
		Sleep(1000);
	}while(CheckIfAllFlase());

	for(int i=0; i< int(TotalThread); i++)
		CloseHandle(hThread[i]);

	cout << endl << endl << endl << "Work is Done!!!";
	_getch();
  return 0;
}

long WINAPI WriteToDisk(int koko){
	byte TH;
	TH=0;
	do{
		if(started[TH] == true)
			TH++;
	}while(started[TH] == true);
	started[TH]= true;
	WrittenData[TH] = 0;
	fstream myfile;
	string path = "E:\\";
	char ID_c[2];
	itoa(TH+1,ID_c,10);
	path.insert(3,ID_c);
	myfile.open( path.c_str());
	long double Repeat = ceil(TotalDataByThread / SizeOfTempData);
	for(int i=0; i < Repeat; i++){
		myfile << TempData;
		WrittenData[TH] += SizeOfTempData;
	}
	myfile.close();
	started[TH]= false;
	return 0;
}

void gotoxy(int x, int y ){
  COORD coord;
  coord.X = x;
  coord.Y = y;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord
    );

}

bool CheckIfAllFlase(void){
	for(int i=0; i< 9; i++){
		if(started[i]==true)
			return true;
	}
	return false;
}

Conclusion :


Des suggestion ou commentaire seront les bienvenus!

A voir également

Ajouter un commentaire

Commentaires

Messages postés
7
Date d'inscription
vendredi 8 juin 2012
Statut
Membre
Dernière intervention
8 juin 2012

Quand on veut se former en lisant les codes des autres, on ne recherche pas necessairement un code parfait. Les imperfections du code accompagnées des remarques et commentaires d'autres personnes me paraissent instructives. Et, donc, ce code m'interesse et je prendrais le temps de l'étudier.
Les remarques sur les différentes façons d'écrire sur disque m'interressent. Pour ma part, suivant l'humeur, j'utilise l'une ou l'autre. Ici, j'aurais sans doute choisi CreateFile, WriteFile et CloseHandle parce que je présume qu'elle sont plus rapides. Mais, dans d'autres cas, je préfère utiliser le bibliothèque standard du CPP qui est théoriquement plus portable.
Messages postés
105
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
30 novembre 2009

merci de ces commentaires contructifs je vais travailler dessus et mettre a jour la source des que possible ;)
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014

"des threads, ça se synchronise" -> pas nécessairement, s'ils doivent accéder en écriture à une zone commune ou s'ils doivent collaborer mais s'ils peuvent travailler chacun dans leur coin sans se marcher dessus ce n'est pas obligatoire
par contre, il vaut mieux connaitre et se faire la main sur les différents synchronismes si on veux faire du multithreading

"si on fait du Windows alors et autres <fstream> n'ont rien à y faire" -> là dessus je suis d'accord, oublies windows E_NEX, penches toi sur boost qui permet de créer des threads avec boost::thread, de les synchronisr avec boost::interprocess, d'accéder au système de fichiers avec boost::filesystem et tout ça de manière portable et efficace
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
UINT64 au lieu de double.
Variable starter NIET => synchro.
fstream => CreateFile, WriteFile, etc.

En avant pour l'effort de code.
Messages postés
105
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
30 novembre 2009

Bonjour BruNews, content de tes commentaires :)

j'utilise le long double car les valeurs doivent stocker la taille des données, en bytes, qui doivent etre crées! donc un disque de 200Gb a remplir, ca en fais des bytes....

pour le WaitForSingleObject cela n'etait pas utile pour le bon fonctionnement!

la boucle tourne tant que les threads n'ont pas fini leur travail et a chaque secondes le travail effectué est mis a jour dans la partie graphique!

des que un thread a fini son travail, il le spécifie dans la variable starter!

je ne comprends pas la partie de iomanip et fstream!

j'en n'ai pourtant besoin!

je sais que je ne suis pas un expert et peut-être que je ne comprends pas tout ce que tu dis mais je code les choses bizzarement! Et ton commentaire spécifiant que ma source allait etre supprimée me laisse perplexe pour deux raisons:

1_ je n'ai pas l'impression que tu ai bien analysé le fonctionnement du programme

2_ moi quand je cherche de l'aide, je consulte rarement les forums mais plutot les codes avec les commentaires.

parcontre je promet que si ma source est encore la demain, je ferait l'effort de la commenter ;)

Allez, A+
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.