PDA

Просмотр полной версии : Проблема с C#


[x26]VOLAND
04.10.2007, 14:35
[С#]
Такая проблема. Во время выполнения ресурсоёмкой операции (напр, генерации множества паролей в файл) программа полностью "зависает" - нельзя нажимать кнопки и т.д. Как это исправить?
Нужно чтобы я мог добавить кнопку отмены операции, выводить прогресс операции (сколько паролей сгенерировано)...

Программа построена на таком принципе:
button_click()
{
for (... число паролей)
{
генерация паролей;
запись в файл;
}
}

Огромная просьба не флеймить.

inv
04.10.2007, 14:37
1 поток ..асинхронная работа
2 не по теме ,автор почему ты и многие не могут прочитать не одной книжки перед тем как садиться что-то писать.
3.гугл-)

inv
04.10.2007, 18:07
в одном потоке генерация паролей и изменение прогресс бара

кнопочка стоп меняет какую-то переменную которая явлется флагом для цикла в первом потоке

замечание
--единственное токо надо учесть обращение к флагу из разных потоков.........


примерно так например.

nerezus
04.10.2007, 18:18
Графика вся - в 1 поток.

Helios
04.10.2007, 20:53
юзай BackgroundWorker - компонент из .NetFramework, позволяет выполнять методы в отдельных потоках в фоне и передавать из них данные о состоянии работы в основной поток.

В MSDN работа с ним довольно хорошо описана + примеры.

_Great_
05.10.2007, 09:20
2. Дана формула:
float d = 1 / 260;
d получается равным 0.0
Что за бред? пробовал менять тип float на double и decimal - не помогло.
А все просто. 1/2 тоже равна нулю, 1/3 тоже.

Анализ выражения 1/260 начинается с определения типов операндов. Оба типа - int, поэтому результат будет тоже типа инт. Производится целочисленное деление с отбрасыванием дробной части - результат 0, потом он преобразовывается к типу float и получается 0.0

Выход - нужно делить не целые числа, а дробные. 1.0/260.0

вот примерный код:
PHP код:
void gendic()
{
<текст метода>
}

void button1_Click()
{
Thread t = new Thread(gendic);
t.Start();
}
void button2_Click()
{
<ОСТАНОВКА ПОТОКА> // ???
}

Собственно C# не знаю, но догадываюсь, что объект t стоит сделать глобальным и в button2_Click() вызвать какойто его метод, отвечающий за остановку потока

Helios
05.10.2007, 15:44
Метод gendic, равно как и элемент класса t, должен быть статическим, то есть мог вызываться без создания объекта данного класса.

Вот тебе пример из MSDN, комменты прилагаются.

using System;
using System.Threading;

public class Worker
{
// This method will be called when the thread is started.
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldStop;
}

public class WorkerThreadExample
{
static void Main()
{
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);

// Start the worker thread.
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");

// Loop until worker thread activates.
while (!workerThread.IsAlive);

// Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1);

// Request that the worker thread stop itself:
workerObject.RequestStop();

// Use the Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
}



Результат работы:

main thread: starting worker thread...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: terminating gracefully...
main thread: worker thread has terminated

W!z@rD
05.10.2007, 15:54
метод позволяет "снимать" визуальный эффект "висячки" Application.DoEvent();

пауза с помощью метода Interrupt
отмена потока с помощью Abort

О потоках на русском языке http://rsdn.ru/article/dotnet/CSThreading1.xml