

C# Thread.Sleep();
Ahoj mám jeden problém. Potřebuju aby se mi v VS opakovala jedna funkce každých X sekund. Doba prodlení se určuje podle "numericUpDown.Value". Do Thread.Sleep(numericUpDown * 1000 [aby to bylo ve vteřinách]) a děje se mi to, že potom když to chci opakovat řekněme 5x po 2 vteřinách, tak místo toho se stane to že po 10 vteřinách se mi to 5x vypíše, ale já to potřebuju vypsat-2 vteřiny-vypsat-2 vteřiny-vypsat atd... Nevíte někdo co s tím?
Můj kód:
private void Pozdrav_Click(object sender, EventArgs e)
{
int a = Convert.ToInt32(numericUpDown2.Value);
a = a * 1000;
for (int z = 0; z < 5 && a != 0; z++)
{
DateTime start = DateTime.Now;
string s = ws.WSXPozdrav();
TimeSpan i = DateTime.Now - start;
Vypis3.Text += s + "\r\n";
Thread.Sleep(a);
}
}
Předem děkuji
Pokud jsem pochopil tvůj zmatečný projev, a kód, vadí ti, že pokud již aktivuješ kód, tak se provádí 5x.
A výpis se provede až na úplném konci vlákna (nikoliv v průběhu).
Jde o prioritu operací ve Win32API.
Grafické operace jsou nejnáročnější, a tak se změna provádí až ke konci všech ostatních výpočtů.
Pokud se to má chovat, jak zamýšlíš, tak třeba takto:
private void Pozdrav_Click(object sender, EventArgs e)
{
var worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
AnotherThread();
}
private void AnotherThread()
{
int a = Convert.ToInt32(numericUpDown2.Value);
a = a * 1000;
for (int z = 0; z < 5 && a != 0; z++)
{
DateTime start = DateTime.Now;
string s = ws.WSXPozdrav();
TimeSpan i = DateTime.Now - start;
Vypis3.Text += s + "\r\n";
Thread.Sleep(a);
}
}
Píšu z paměti, tak za nic neručím.
Děkuji za reakci. Ano vím, že jsem to napsal trochu zmateně, ale už jsem opravdu ve slepé uličce. Nicméně jsem zkusil aplikovat co jste mi napsal, ale program nijak nereaguje
private void Pozdrav_Click(object sender, EventArgs e)
{
var worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
AnotherThread();
}
private void AnotherThread()
{
int a = Convert.ToInt32(numericUpDown2.Value);
a = a * 1000;
for (int z = 0; z < 5 && a != 0; z++)
{
DateTime start = DateTime.Now;
string s = "Ahoj";
TimeSpan i = DateTime.Now - start;
if (this.InvokeRequired)
{
this.BeginInvoke(new Action(() => this.printValues("Ahoj")));
}
Thread.Sleep(a);
}
}
private void printValues(string values)
{
Vypis3.Text += values + "\r\n";
}
Tak to funguje, strašně moc děkuju a přeji hezký zbytek dne