[С#] Такая проблема. Во время выполнения ресурсоёмкой операции (напр, генерации множества паролей в файл) программа полностью "зависает" - нельзя нажимать кнопки и т.д. Как это исправить? Нужно чтобы я мог добавить кнопку отмены операции, выводить прогресс операции (сколько паролей сгенерировано)... Программа построена на таком принципе: PHP: button_click() { for (... число паролей) { генерация паролей; запись в файл; } } Огромная просьба не флеймить.
1 поток ..асинхронная работа 2 не по теме ,автор почему ты и многие не могут прочитать не одной книжки перед тем как садиться что-то писать. 3.гугл-)
в одном потоке генерация паролей и изменение прогресс бара кнопочка стоп меняет какую-то переменную которая явлется флагом для цикла в первом потоке замечание --единственное токо надо учесть обращение к флагу из разных потоков......... примерно так например.
юзай BackgroundWorker - компонент из .NetFramework, позволяет выполнять методы в отдельных потоках в фоне и передавать из них данные о состоянии работы в основной поток. В MSDN работа с ним довольно хорошо описана + примеры.
А все просто. 1/2 тоже равна нулю, 1/3 тоже. Анализ выражения 1/260 начинается с определения типов операндов. Оба типа - int, поэтому результат будет тоже типа инт. Производится целочисленное деление с отбрасыванием дробной части - результат 0, потом он преобразовывается к типу float и получается 0.0 Выход - нужно делить не целые числа, а дробные. 1.0/260.0 Собственно C# не знаю, но догадываюсь, что объект t стоит сделать глобальным и в button2_Click() вызвать какойто его метод, отвечающий за остановку потока
Метод gendic, равно как и элемент класса t, должен быть статическим, то есть мог вызываться без создания объекта данного класса. Вот тебе пример из MSDN, комменты прилагаются. Code: 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."); } } Результат работы:
метод позволяет "снимать" визуальный эффект "висячки" Application.DoEvent(); пауза с помощью метода Interrupt отмена потока с помощью Abort О потоках на русском языке http://rsdn.ru/article/dotnet/CSThreading1.xml