Afficher une progressbar pendant l'ouverture d'une image

Jm2F Messages postés 2 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 16 septembre 2005 - 15 sept. 2005 à 09:38
Jm2F Messages postés 2 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 16 septembre 2005 - 16 sept. 2005 à 09:24
ImageNodeCmd* cmd = static_cast(_ProjectManager->get_Command( "Create Image"
));


fs = new FileStream(filename,FileMode::Open,FileAccess::Read);


cmd->Pathname = filename;


img = Image::FromStream(fs);

Bonjour, je programme en c++ managé, un peu proche du c#, et ce que je cherche à faire c'est qu'en ouvrant une très grosse image taille > 100Mo, d'afficher une progress barre présentant l'état d'avancement. un peu comme ce qui est fait dans logiciel paintshop corel truc ça.

Malheureusement j'ai beau cherché, je ne trouve pas comment faire donc c'est pour cela que je lance cet appel à l'aide.

Jm2f

2 réponses

cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
16 sept. 2005 à 09:02
Salut,



J'ai pas la solution, mais du dois pouvoir trouver dans le code de
Paint.NET comment c'est fait. Y a les sources de la version 2.1b

http://www.eecs.wsu.edu/paint.net/


Bonne chance

Chris

N'oubliez pas de cloturer votre post.
0
Jm2F Messages postés 2 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 16 septembre 2005
16 sept. 2005 à 09:24
Eureka, j'ai fini par trouver, je vous remercie beaucoup.

Pour l'astuce, je l'ai trouvé sur la route, très simple. Comme je passe par un FileStream pour lire ma grosse image, il suffit de faire appel à deux threads.

_ Le premier va lire la position de l'itérateur dans le flux et va la transmettre à la valeur de la progressBar et mettre à jour le formulaire qui contient la progressBar.

_ Et le deuxième va lire et créer l'image tout simple.

On initialise la progressBar avec les données du flux.

voici le code pour l'initialisation


_imageThread =



new Thread(
new ThreadStart(
this,ImageThreadProc));


_progressBarThread =



new Thread(
new ThreadStart(
this,ProgressBarThreadProc));


_progressBarDlg->ProgressBarImage ->BarMin = Convert::ToInt32(fs->Position);


_progressBarDlg->ProgressBarImage->BarMax = Convert::ToInt32(fs->Length);


_manualResetEvent =
new ManualResetEvent(
false);


_imageThread->Start();


_progressBarThread->Start();


_progressBarDlg->Show();


_manualResetEvent->WaitOne();


_progressBarDlg->Close();



this->Update();


et le traitement des deux threads


private: System::Void ImageThreadProc()


{


_image = Image::FromStream(fs);


_progressBarThread->Abort();


_manualResetEvent->Set();


}


private: System::Void ProgressBarThreadProc()


{



while(
true)


{


_progressBarDlg->ProgressBarImage->BarValue =


Convert::ToInt32(fs->Position);


_progressBarDlg->Update();


}


}



Mais bon le souçis c'est que je fais des conversions de 64 vers 32, et cela va me causer un jour des problèmes sur la progressBar lol.

Voila.
0
Rejoignez-nous