begin process at 2010 02 10 01:10:55
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > DISK FILLER MULTI THREADING

DISK FILLER MULTI THREADING


 Information sur la source

Note :
Aucune note
Catégorie :Fichiers / Disque Classé sous :Disk, filler, disque, multithreading Niveau :Débutant Date de création :05/01/2009 Date de mise à jour :05/01/2009 16:43:13 Vu :1 450

Auteur : e_NeX

Ecrire un message privé
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • #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;
  • }
#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!


 Historique

05 janvier 2009 04:40:09 :
ajout capture...

 Sources de la même categorie

Source avec Zip Source avec une capture ID3 TAG COVER ALBUM IMAGE par nanonavich
FILEREADER par FrancoisGauthier
Source avec Zip CLASSE AVANCÉE DE LOG, THREAD SAFE ET DIVERSES SURCHARGES par sboli
Source avec Zip Source avec une capture Source .NET (Dotnet) INFILESEEKER par swonder
Source avec Zip Source avec une capture USB DETECTION par abandonware

 Sources en rapport avec celle ci

Source avec Zip TXT SUPPRIMER LIGNES DOUBLONS (WIN32) par BruNews
Source avec Zip BASE DE DONNÉES FICHIER par xasm
LISTEUR DE FICHIERS/DOSSIERS par saylar
Source avec Zip KEYLOGGER : SERVEUR/CLIENT (EN MULTI-THREAD) par thesimsone
Source avec Zip Source avec une capture [C/WIN32] DISKINFORMATIONS : AFFICHE DIVERSES INFORMATIONS S... par deck_bsd

Commentaires et avis

Commentaire de BruNews le 05/01/2009 09:46:28 administrateur CS

Salut,

des threads, ça se synchronise (WaitForSingleObject, WaitForMultipleObject), on ne fait pas de boucles éternelles pour savoir leur état.
Des 'double' n'ont rien à faire dans des calculs d'espace disque, on n'adresse que des octets complets.
Faut être cohérent en codant, si on fait du Windows alors <iomanip> et autres <fstream> n'ont rien à y faire.

char ID_c[2];
itoa(TH+1,ID_c,10);
NON, tu n'as qu'1 octet pour écrire le nombre (l'autre est pour le 0 final).

etc, etc...

C'est tres bien que tu commences la prog, je t'encourage a continuer.
Pour autant il ne faut pas confondre ton dossier de tests et les sources CS.
Une source se doit d'expliciter un point precis de prog, de repondre a une question souvent posee sur le forum, ..., un truc UTILE en somme.
Etudie bien avant et tu nous reposeras une source valable plus tard.
Un debutant doit étudier, les publications viendront plus tard.

Cette souurce sera supprimée en soirée.

Commentaire de e_NeX le 06/01/2009 05:56:15

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+

Commentaire de BruNews le 06/01/2009 09:51:46 administrateur CS

UINT64 au lieu de double.
Variable starter NIET => synchro.
fstream => CreateFile, WriteFile, etc.

En avant pour l'effort de code.

Commentaire de shenron666 le 06/01/2009 20:40:51

"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 <iomanip> 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

Commentaire de e_NeX le 06/01/2009 21:51:37

merci de ces commentaires contructifs je vais travailler dessus et mettre a jour la source des que possible ;)

Commentaire de Jojo Lancien le 12/01/2009 08:56:40

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Variable int sur le disque... [ par nullspace ] Je cherche à enregistrer et lire sur le disque par ofstream et ifstream à partir de variables de type int.Seulement il m'écrit sous format texte.En vb comment on fait pourn trouver un fichier sur le disque un c++ [ par Wipet2k ] boujour J'aimerais savoir comment on fait pour trouverun ficher sur le disque dur en c++Merci d'avence :) Comment faire pour rechercher un fichier dans tout le disque dur ? [ par appstmd ] Salut !J'ai besoin de savoir comment on peut scanner le disque dur à la recherche d'un fichier déterminé. Quelqu'un connait-il une astuce ou un algori [VC]mettre un Fichier dans les ressources d'une exe et que l'exe puisse le copier allieur sur le disk [ par cybmat ] en fait je veut que mon exe est un autre fichier dans "lui" ( dans c ressource ou autre) et qu'il le copy sur le disk a uen action du programme.merci lister les fichiers du disque dur en c et non en c++ [ par sebos2013 ] Quelqu'un pourrait il m'aider.J'essaie de creer un prog en c qui permet de listertout les fichiers du disque dur et de stoquer le nom et le chemin de multithreading et opengl [ par hdi ] je doit realiser une simulation avec un affichage 3D (opengl ou open inventor), pour cela je vais realiser deux threads, un qui s'occupe des calcul po multithreading et opengl [ par hdi ] je doit realiser une simulation avec un affichage 3D (opengl ou open inventor), pour cela je vais realiser deux threads, un qui s'occupe des calcul po Formatage [ par sniperfou ] Salut, Je souhaiterais savoir comment formater un disque dur, car je suis entrain de crée un gestionnaire de disque dur, et je ne trouve pas cette fon importer des bmp ou jpeg du disk dur dans un projet vc++6 et les mettres en fond sur une boite de dialigue ou un bouton [ par retaks666 ] j'aimerais savoir comment importer des bmp ou jpeg du disk dur dans un projet vc++6 et les mettres en fond sur une boite de dialigue ou un bouton. je DialogBox pour recuperer un fichier sur le disque... [ par coyote19 ] J'ai besoin de recuperer un path d'un fichier. J'ai reussi grace a la fonction SH_BrowseForFolder et les objets BROWSEINFO, mais a present je ne voudr


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales