Страница: 1 | 2 | 3 |
|
Вопрос: Delay
|
Добавлено: 26.05.09 17:17
|
|
Номер ответа: 22 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #22
|
Добавлено: 28.05.09 22:37
|
_Serega пишет:
Тут торможения не надо, тут в отдельном теневом потоке нужно запускать открытие файла - тогда торможения при выводе элементов текста не будет, все от того, что при передаче вызовов от среды .Net к АРI вызовам, что происходет при вызове Shell, тогда для системы наиболее приоритетным становится API вызов, поэтому отработка .Net среды тормозится и в некотроых случаях помогает настройка ускорения системы Windows - Свойства системы - Параметры быстродействия, но корректное решение - всеж отдельный поток создавать.
Все правильно кроме того что помечено курсивом.
_Serega, будь добр, уважь мою просьбу в топике http://vbnet.ru/forum/show.aspx?id=189692&page=4, меня интерисует, в чем, по твоему мнению, мои представления о .NET неверные?
Ответить
|
Номер ответа: 25 Автор ответа: _Serega
Вопросов: 1 Ответов: 43
|
Профиль | | #25
|
Добавлено: 28.05.09 23:29
|
В Параметрах быстродействия определяется приоритет выполнения потоков, который перераспределяется или для системных программ или для прикладных. Win 32 API - это основа посредством которой Windows "общается" c аппаратной частью, то есть когда выполняется команда считывания файла мы не обращаемся непосредственно к жесткому диску, как к физическому устройству и мы не задумываемся ни над аппаратными прерывавниями, ни аппаратными адресами - для этого есть драйвера, но при этом среда .Net вообще никак не взаимодействет и с драйверами устройств, для нас Windows организовывает уже высокоуровневое логическое устройство, как диск C: к примеру, но с таким устройством в действительности взаимодействует API, а мы из среды .Net вызываем API, к которому обращаемся через шлюзы CLR. Это в двух словах, а вообще это большой материал и не на одну книгу.
Ответить
|
Номер ответа: 26 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #26
|
Добавлено: 28.05.09 23:34
|
_Serega, успокойся. Кроме тебя здесь никто не нашел хамства и личностных разборок.
Проблема которая стоит перед топик-стартером абсолютно тривиальна.
Рассматриваем код
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- TextBox1.Text = "Текст" & Rnd(123456767)
- Thread.Sleep(3000)
- Shell("c:\1.bat", AppWinStyle.NormalFocus, True)
- End Sub
1) Каким образом происходит генерация события Button.Click? После клика по кнопке основной цикл обработки сообщений получает сообщение WM_RBUTTONUP, которое трактуется .NET как клик и приводит в конечном счете к генерации данного события.
2) Каким образом происходит установка текста в TextBox?
Для того чтоб произошло обновление и перерисовка содержимого TextBox, должны обработаться несколько Windows-сообщений (скорее всего что-то вроде WM_SETTEXT и WM_PAINT, может еще что-то - можно легко проверить).
3) Каким образом выполняется задержка Thread.Sleep?
Я не располагаю инфомрацией как реализован этот метод, но могу предположить что он просто вызывает функции Win32API Sleep, которая блокирует выполнение потока на некоторое время.
4) Как работает метод Shell? Скорее всего через функцию API ShellExecute/ShellExecuteEx. При этом происходит запуск нового процеса и после этого выполнение возвращается обратно в упралвяемый код.
После выполнения Shell процедура завершает свою работу и цикл обработки сообщений сможет выполнить обработку поставленных туда WM_SETTEXT и WM_PAINT и что туда еще поставили.
Таким образом, обновление текста на TextBox произойдет только после того как завершится процедура Button_Click.
Способ решения я уже приводил - можно через Threading.Timer запланировать запуск нужного кода через определенное время.
Можно запустить новый поток.
Можно запустить код запуска процеса асинхронной операцией BeginInvoke.
Также можно дать команду принудительно обработать поступившие сообщения в очередь:
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- TextBox1.Text = "Текст" & Rnd(123456767)
- Application.DoEvents()
- Thread.Sleep(3000)
- Shell("c:\1.bat", AppWinStyle.NormalFocus, True)
- End Sub
О приоритете функции Win32API говорить нет никакого смысла, так как функция ShellExecute выполняется в том же потоке в котором выполняется Button1_Click.
А вот запущеный батник, разумеется, будет выполняться в другом процесе и кто раньше кого выполнится, зависит от планировщика Windows, текущей загруженности системы и еще кучи факторов. При этом могу тебе точно сказать, что обновление содержимого TextBox произойдет намного раньше чем новосозданный процес успеет проинициализироваться и показать какой-то свой UI, если он у него есть.
Ответить
|
Номер ответа: 27 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #27
|
Добавлено: 28.05.09 23:39
|
_Serega пишет:
В Параметрах быстродействия определяется приоритет выполнения потоков, который перераспределяется или для системных программ или для прикладных. Win 32 API - это основа посредством которой Windows "общается" c аппаратной частью, то есть когда выполняется команда считывания файла мы не обращаемся непосредственно к жесткому диску, как к физическому устройству и мы не задумываемся ни над аппаратными прерывавниями, ни аппаратными адресами - для этого есть драйвера, но при этом среда .Net вообще никак не взаимодействет и с драйверами устройств, для нас Windows организовывает уже высокоуровневое логическое устройство, как диск C: к примеру, но с таким устройством в действительности взаимодействует API, а мы из среды .Net вызываем API, к которому обращаемся через шлюзы CLR. Это в двух словах, а вообще это большой материал и не на одну книгу.
Никто не спорит.
Те опции которые находятся на указанной тобою вкладке используются, чтоб указать Windows, каков сценарий использования компьютера - либо это рабочая станция, либо это сервер, и таким образом Windows решает как распределять приоритет выполнения между клиентскими программами и службами (не обязательно системными).
Вызовы Win32API ко всему этому не имеют практически никакого отношения.
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму