IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   вопрос програмистам на C# (https://www.imho.ws/showthread.php?t=75690)

palexv 13.12.2004 23:44

вопрос програмистам на C#
 
Как добится в C# еффекта анологичного Application.ProcessMessages в делфи? То есть чтобы во время интенсивной работы приложения можно было нажимать кнопки на форме в часности чтобы остановить алгоритм.

Dimm 14.12.2004 04:35

Используй потоки (threads).

2 варианта написания:

1) создаешь поток через ThreadPool и контролируешь его (остановка/запуск) с помощью event'ов

2) Более правильный вариант. Создать объект Thread, запустить его. Поскольку объект в твоих руках - ты полностью контролируешь его.
Когда захочешь - сделаешь Suspend, захочешь - Resume.

Da(nil)ka 14.12.2004 11:47

Попробуй использовать делегат для запуска этих вычилений и один из его методов Invoke или BeginEnvoke, т.е. асинхронные или синхронные делегаты.
Всё это не плохо описано Крисом Селлзом (Chris Sells), прямые линки на статейки по русски:
_http://www.gotdotnet.ru/LearnDotNet/NETFramework/599.aspx
_http://www.gotdotnet.ru/LearnDotNet/NETFramework/598.aspx
_http://www.gotdotnet.ru/LearnDotNet/NETFramework/596.aspx

Dimm 14.12.2004 12:43

Da(nil)ka

И чем это по-твоему отличается от 1-го способа? Тот-же самый ThreadPool,
только в этом случае для контроля над остановкой придется использовать events в самой функции алгоритма, что не есть красиво.

aramis 14.12.2004 17:39

а не проще ли Application.DoEvents() ?

Dimm 14.12.2004 17:43

aramis

Интересо, а ты шапку читал? Человеку надо не просто запустить вычисления асинхронно, а управлять ими: остановить или запустить вновь.

Yan1k 14.12.2004 18:03

Цитата:

Сообщение от [Ghost]
Da(nil)ka

И чем это по-твоему отличается от 1-го способа? Тот-же самый ThreadPool,
только в этом случае для контроля над остановкой придется использовать events в самой функции алгоритма, что не есть красиво.

Это отличается от Вашего способа. Поточные функции не поддерживают входных параметров, а, используя делегаты, можно передавать свои значения. Не обязательно использовать event для остановки, об этом говорится в статейкай, ссылки на которые приведены выше. И имхо в любом случае, если из дополнительных "рабочих" потоков мы будем изменять что-то в GUI интерфейсе, то нам придётся передавать управление в его поток. Для этого либо использовать Invoke, BeginInvoke контролов формы, либо написать функцию, и оборачивать её делегатом.

aramis 14.12.2004 18:12

Цитата:

Сообщение от [Ghost]
aramis

Интересо, а ты шапку читал? Человеку надо не просто запустить вычисления асинхронно, а управлять ими: остановить или запустить вновь.

если я правильно понял DoEvents, то эта функция приостанавливает действие проги, чтобы обработать те действия, которые стоят "в очереди" у формы( прорисовка и тд). обработка кнопок к ним не относится?

Dimm 14.12.2004 19:22

Yan1k

> "Поточные функции не поддерживают входных параметров"

Кто это Вам сказал? WaitCallback использующийся в ThreadPool имеет signature метода с входным параметром и возвр. void :

ThreadPool.QueueUserWorkItem( new WaitCallback( this.PostInitCallback ) );
...

private void PostInitCallback( object state )
{
...

В любом случае, как я говорил, использование ThreadPool не самый лучший способ. Я предпочел бы создание своего объекта Thread.


aramis

> "чтобы обработать те действия, которые стоят "в очереди" у формы( прорисовка и тд). обработка кнопок "


А причем здесь прорисовка кнопок и другие действия формы ???
Все человеку надо - это запустить алгоритм вычислений в background'е и иметь возможность остановить/возобновить его.

aramis 14.12.2004 19:33

Цитата:

Сообщение от [Ghost]
Yan1k

aramis

> "чтобы обработать те действия, которые стоят "в очереди" у формы( прорисовка и тд). обработка кнопок "


А причем здесь прорисовка кнопок и другие действия формы ???
Все человеку надо - это запустить алгоритм вычислений в background'е и иметь возможность остановить/возобновить его.

ну, про background речи и не было. если я правильно понял palexv, то он хотел чтобы его форма реагировала на внешние раздражители даже при "полном загрузе" и исходил из этого

Yan1k 14.12.2004 19:36

[QUOTE='[Ghost]']Yan1k

> "Поточные функции не поддерживают входных параметров"

Кто это Вам сказал? WaitCallback использующийся в ThreadPool имеет signature метода с входным параметром и возвр. void :

ThreadPool.QueueUserWorkItem( new WaitCallback( this.PostInitCallback ) );
...

private void PostInitCallback( object state )
{
...

В любом случае, как я говорил, использование ThreadPool не самый лучший способ. Я предпочел бы создание своего объекта Thread.


Я и имел ввиду не то что используется в ThreadPool, а обычный поток, у него поточная функция БЕЗ параметров.


Часовой пояс GMT +4, время: 15:50.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.