Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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

Předmět Autor Datum
Pokud jsem pochopil tvůj zmatečný projev, a kód, vadí ti, že pokud již aktivuješ kód, tak se provádí…
Flash_Gordon 18.10.2019 11:35
Flash_Gordon
Děkuji za reakci. Ano vím, že jsem to napsal trochu zmateně, ale už jsem opravdu ve slepé uličce. Ni…
ls 18.10.2019 11:48
ls
private void Pozdrav_Click(object sender, EventArgs e) { var worker = new BackgroundWorker(); worker…
Flash_Gordon 18.10.2019 12:07
Flash_Gordon
Tak to funguje, strašně moc děkuju a přeji hezký zbytek dne poslední
ls 18.10.2019 12:38
ls

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.

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

}

Zpět do poradny Odpovědět na původní otázku Nahoru