Prgressbar Inkrement aus anderer Klasse aufrufen
-
Hallo,
ich habe eine Windows-Form Anwendung, die mir an einer Stelle eine recht aufwändige Berechnung ausführen soll. Diese Berechnung findet innerhalb einer eigenen Klasse statt. Nun würde ich gerne einen Fortschrittbalken mit einbauen, damit ich weiß ob ich währrend der Berechnung Zeit habe mir einen Kaffee zu holen. Leider weiß ich nicht, wie ich das ProgressBar aus der Berechnen-Methode meiner Klasse aufrufen kann
Falls wer nachvollziehen kann was ich meine und ein paar Anregungen für mich hat, wär ich darüber sehr dankbar.
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du gibst der Klasse, in der du die Berechnungen durchführst, eine Instanzvariable, in der ein Handle auf die ProgressBar abgelegt wird. Dann kannst du dort den Wert während der Berechnung laufend verändern...??
-
Stehe vor dem selben Problem leider
Wäre echt super wenn sich jemand erbarmen könnte. Durch etwas suchen, habe ich festgestellt, dass es wohl mit Threads gehen muss die dann nebeneinander laufen. Aber so richtig will das bei mir nicht.
Habe ein Thread Beispiel aus dem MSDN ausprobiert. Das klappt auch soweit. Nur kann ich innerhalb des Threads die Progressbar nicht ansprechen.@/rant/ Verstehe das nicht ganz. Wie übergibt mein ein Handle auf die Progressbar?
Die Progressbar wird ja hochgezählt, indem man der Set-Funktion einen Int übergibt.
-
ich988 schrieb:
Die Progressbar wird ja hochgezählt, indem man der Set-Funktion einen Int übergibt.
Welcher Set-Funktion? Genau, die der Property einer Progressbar-Instanz.
myProgressBar->set_Progress( 12 );
myProgressBar ist hier die Referenz auf die ProgressBar (lies: das Handle). Das kannst Du an andere Klassen oder Funktionen übergeben (wie ist denke ich Grundlagenwissen, deshalb hier nur ein ganz einfaches Beispiel)
ref class MyClass { static int MyFunc( ProgressBar^ pb ) { pb->Progress = 12; } } /* irgendwo anders */ MyClass::MyFunc( myProgressBar );
EDIT: Verdammt, ich dachte wir wären im C# Forum.
-
Die Progressbar zu übergeben halt ich nicht für so gut.
Ich gehe mal stark davon aus, dass die Berechnung in einem eigenen Thread läuft, somit muss erstmal ein "Invoke" oder "BeginInvoke" aufgerufen werden, damit der Fortschritt gesetzt werden kann.
Da die Klasse aber rechnen soll und nicht die GUI verwalten soll, würde ich folgendes machen:- Das Form bekommt eine Callback-Funktion "onProgressCB", welche das Invoke steuert
- Die Klasse für die Berechnung bekommt einen delegate auf diese Callback-Funktion
- Als Nebeneffekt ergibt sich dann auch gleich die Möglichkeit, die Berechnung abzubrechen indem die Berechnung nach Aufruf des Delegates den Rückgabewert prüft. Ist dieser "false", muss die Berechnung abgebrochen werden.
Ist jetzt C#-Code, aber ich hab mit c++/cli lang nix mehr gemacht drum ist mir die Syntax nicht mehr ganz geläuft.
public partial class Form2 : Form { public delegate bool dele_progress(int ProgressValue); private bool m_continueCalculation; private dele_progress m_deleProgress; public Form2() { InitializeComponent(); m_deleProgress = new dele_progress(this.onProgressCB); } private void buttonCancel_Click(object sender, EventArgs e) { m_continueCalculation = false; } private bool onProgressCB(int ProgressValue) { if (this.InvokeRequired == true) { this.BeginInvoke(m_deleProgress, ProgressValue); } else { this.progressBar.Value = ProgressValue; } return m_continueCalculation; } } class claculationClass { public void doCalculation(Form2.dele_progress ProgressCB) { for (int i = 0; i < 100; ++i) { bool continueCalculation = ProgressCB(i); if (continueCalculation == false) { // stop calculation break; } else { // proceed with next calculation step } } } }