Και πάλι ευχαριστώ για τις απαντήσεις. Το Application.Events ήταν από τα πρώτα πράγματα που σκέφτηκα. Δεν δουλεύει.
Το έβαλα εκεί που που λες Παναγιώτη, το έβαλα ανάμεσα στις κλήσεις και τα wait, το έβαλα με loop να γίνεται 100 φορές. Τίποτα.
Το πρώτο Step του progressbar δεν κάνει Draw.
Όσον αφορά τα events, δεν είμαι σίγουρος ότι κατάλαβα τί εννοείς. Έγραψα την ακόλουθη υλοποίηση η οποία δεν δούλεψε.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| public partial class Form2 : Form, ILoginProgressBarNotifier
{
public Form2()
{
InitializeComponent();
}
private void button1_Click( object sender, EventArgs e )
{
using( Form1 f = new Form1(this, 3 ) )
{
f.Show();
Application.DoEvents();
OnProgressBarPerformStep( "AAAA" );
Thread.Sleep( 1000 );
OnProgressBarPerformStep( "BBBB" );
Thread.Sleep( 1000 );
OnProgressBarPerformStep( "CCCC" );
Thread.Sleep( 1000 );
}
}
#region Implementation of ILoginProgressBarNotifier
public event ProgressBarPerformStepEventHandler OnProgressBarPerformStep;
#endregion
}
public delegate void ProgressBarPerformStepEventHandler( string msg );
public interface ILoginProgressBarNotifier
{
event ProgressBarPerformStepEventHandler OnProgressBarPerformStep;
}
public partial class Form1 : Form
{
private readonly ILoginProgressBarNotifier m_progressNotifier;
private readonly int m_numOfSteps;
public Form1( ILoginProgressBarNotifier progressNotifier, int numOfSteps )
{
m_progressNotifier = progressNotifier;
m_numOfSteps = numOfSteps;
m_progressNotifier.OnProgressBarPerformStep += DoStep;
InitializeComponent();
}
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose( bool disposing )
{
if( disposing && ( components != null ) )
{
components.Dispose();
}
m_progressNotifier.OnProgressBarPerformStep -= DoStep;
base.Dispose( disposing );
}
private void Form1_Load( object sender, EventArgs e )
{
progressBar1.Step = (int)Math.Ceiling( 100.0 / m_numOfSteps );
}
public void DoStep(string msg)
{
progressBar1.PerformStep();
label1.Text = msg;
label2.Text = String.Format( "{0}%", progressBar1.Value );
label1.Refresh();
label2.Refresh();
}
} |
Αυτό εννοούσες?
Πάντως και στην ίδια την φόρμα να τρέχει ο κώδικας (χωρίς να καλείται από άλλη φόρμα) πάλι έχει την ίδια συμπεριφορά.
Όσο για τα Tasks, θέλω να επαναλάβω ότι ΔΕΝ υπάρχει κάποια χρονοβόρα διαδικασία που περιμένω να τρέξει.
Ή ακόμα και αν υπάρχει, είναι αδιάφορο για την φόρμα που έχει το progressbar.
Η δουλειά της φόρμας αυτής είναι να είναι ζωντανή όσο θέλει ο developer και να περιμένει από αυτόν triggers ώστε να κάνει PerfromStep.
Η φόρμα πρέπει να είναι όσο πιο "χαζή" γίνεται.
Συν τοις άλλοις, δεν έχουμε ακόμα περάσει σε .net 4.5 σαν εταιρία οπότε..
Γιώργο ο κώδικα που δίνω είναι τα έτοιμα παραδείγματα. Απλά χρειάζεται το design κομμάτι. Πώς κάνω attach ένα project?