Проблема с C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by [х26]VОLАND, 4 Oct 2007.

  1. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    [С#]
    Такая проблема. Во время выполнения ресурсоёмкой операции (напр, генерации множества паролей в файл) программа полностью "зависает" - нельзя нажимать кнопки и т.д. Как это исправить?
    Нужно чтобы я мог добавить кнопку отмены операции, выводить прогресс операции (сколько паролей сгенерировано)...

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

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    1 поток ..асинхронная работа
    2 не по теме ,автор почему ты и многие не могут прочитать не одной книжки перед тем как садиться что-то писать.
    3.гугл-)
     
    #2 inv, 4 Oct 2007
    Last edited: 4 Oct 2007
  3. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    в одном потоке генерация паролей и изменение прогресс бара

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

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


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

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Графика вся - в 1 поток.
     
  5. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    юзай BackgroundWorker - компонент из .NetFramework, позволяет выполнять методы в отдельных потоках в фоне и передавать из них данные о состоянии работы в основной поток.

    В MSDN работа с ним довольно хорошо описана + примеры.
     
    1 person likes this.
  6. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    А все просто. 1/2 тоже равна нулю, 1/3 тоже.

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

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

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

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Метод 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.");
        }
    }
    
    
    Результат работы:

     
  8. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    метод позволяет "снимать" визуальный эффект "висячки" Application.DoEvent();

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

    О потоках на русском языке http://rsdn.ru/article/dotnet/CSThreading1.xml
     
    #8 W!z@rD, 5 Oct 2007
    Last edited: 6 Oct 2007