Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 60

При запуске посторонней программы виснет форма

02.08.2011, 22:41. Показов 1766. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть форма с кнопкой, таймером и статусбаром, в котором тикают часики (по указанному таймеру). При нажатии на кнопку запускается посторонняя программа (архиватор).
Проблема: пока работает архиватор, не тикают часики (виснут). Как только архиватор отработал – всё становится ОК.
Вопрос: как сделать так, чтобы часики не останавливались? Т.е. чтобы работали параллельно с архиватором.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.08.2011, 22:41
Ответы с готовыми решениями:

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

JFrame при запуске программы форма не появляется
Добрый день, начал осваивать Яву, и тут же наткнулся на первые грабли. Создал приложение по этому пособию...

Почему не при запуске программы не отображается вторая форма?
Здравствуйте! Не могу понять почему не при запуске программы отображается только первое диалоговое окно... Form1) using System; ...

11
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
03.08.2011, 10:42
Делай таймер через API.
Как? - используй поиск по форуму.
0
1 / 1 / 0
Регистрация: 01.05.2011
Сообщений: 203
05.08.2011, 22:30
А ты DoEvents не пробовал?
0
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 60
11.08.2011, 22:39  [ТС]
Пробовал.
Не помогло ни то, ни другое.
Попробуйте сами: положите на форму Label, в котором по таймеру тикают часики типа
Format(Now, 'hh:mm:ss')
, и кнопку, при нажатии на которую запускается процесс копирования крупного файла типа
CopyFile 'matrix.avi', 'matrix_copy.avi', 0
На время копирования (независимо от типа таймера - VB или API) часики виснут. Как это побороть?
0
1 / 1 / 0
Регистрация: 01.05.2011
Сообщений: 203
12.08.2011, 01:52
Это может и да, но... если копировать файл по частям, то DoEvents какраз поможет.

Ты попоробуй архивировать файл по частям, ну тоесть взял кусок, заархевировал, записал, взял следующий, заархевировал, дописал к тому, взял следующий, заархевировал, дописал и т.д.
И какраз, после архивации 1 части твои часы будут обновляться.
И не забудь про DoEvents
0
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 60
12.08.2011, 11:27  [ТС]
А как это - 'по частям'?
А если нужно заархивировать целый каталог с 500 файлами?
Архивировать каждый файл в отдельности? Это же займёт раз в 10 больше времени!
0
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
12.08.2011, 23:40
Про копирование больших файлов.
Используйте код, потипа того, что ниже. Возможно, правда, я немного напутал с размером, там где проверка идет на конец файла, но не беда, посмотрите, если работать не будет. естественно есть смысл поиграться с размером буфера.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Option Explicit
 
Private Sub Command1_Click()
 
Dim f1 As String
Dim f2 As String
 
ReDim Buf(1023) As Byte
Dim Done As Long
 
f1 = 'E:MP3DJ Virgendj_virgen_-_enlightened.mp3'
f2 = 'C:1.mp3'
Open f1 For Binary Access Read As #1
Open f2 For Binary Access Write As #2
Do While Done < FileLen(f1)
    If FileLen(f1) - Done < 1023 Then ReDim Buf(FileLen(f1) - Done)
    Get #1, Done + 1, Buf()
    Put #2, Done + 1, Buf
    Done = Done + UBound(Buf)
    Caption = Round(Done / FileLen(f1) * 100, 2) & '%'
Loop
Close #1
Close #2
MsgBox 'ok'
End Sub
0
Comanche
13.08.2011, 11:28
2pancer:
Хочешь асинхронности копирования - откажись от CopyFile в пользу SHFileOperation. Должно помочь. Или можно использовать CopyFileEx, и наращивание цифирь производить прям из callback-функции (и таймер на время копирования можно отключить).
Сам не пробовал, но один из этих вариантов по идее должен сработать.
Comanche
13.08.2011, 11:29
Кстати, в первоначальном варианте вопроса речь шла не о копировании, а о запуске некоего архиватора. А как именно он у тебя запускается?!
Сумрак
13.08.2011, 11:41
Ага. согласен с Команчи. По поводу запуска Архиватора.
Если РАР, он может запускаться в фоновом режиме. Может его с какими нить ключами запускать... Тогда он по идее не должен напрягать VB. Может в этом направлении поискать?
Comanche
13.08.2011, 12:09
Скорее всего, у него архиватор запускается с отслеживанием завершения (известный пример с OpenProcess и GetExitCodeProcess) - а там если делать цикл с DoEvents, то тормоза таймера будут неизбежны. Если же привинтить SetTimer, то анализировать GetExitCodeProcess можно не в цикле, а в таймерной функции, и в ней же (!) наращивать цифирки.

Не уверен, что спасёт, но попробовать можно. То, что 'таймер + DoEvents' = чёрт-знает-что, у меня сомнения не вызвает.
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 60
13.08.2011, 20:53  [ТС]
Архиватор запускается так:

Модуль:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Option Explicit
Public Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
 
Public Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
 
Public Declare Function WaitForSingleObject Lib 'kernel32' (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function InputIdle Lib 'user32' Alias 'WaitForInputIdle' (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcessA Lib 'kernel32' (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function GetExitCodeProcess Lib 'kernel32' (ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function CloseHandle Lib 'kernel32' (ByVal hObject As Long) As Long
 
Public Const NORMAL_PRIORITY_CLASS As Long = &H20&
Public Const INFINITE As Long = -1&
 
Public Const STATUS_WAIT_0 As Long = &H0
Public Const STATUS_ABANDONED_WAIT_0 As Long = &H80
Public Const STATUS_USER_APC As Long = &HC0
Public Const STATUS_TIMEOUT As Long = &H102
Public Const STATUS_PENDING As Long = &H103
 
Public Const WAIT_FAILED As Long = &HFFFFFFFF
Public Const WAIT_OBJECT_0 As Long = STATUS_WAIT_0
Public Const WAIT_TIMEOUT As Long = STATUS_TIMEOUT
 
Public Const WAIT_ABANDONED As Long = STATUS_ABANDONED_WAIT_0
Public Const WAIT_ABANDONED_0 As Long = STATUS_ABANDONED_WAIT_0
 
Public Const WAIT_IO_COMPLETION As Long = STATUS_USER_APC
Public Const STILL_ACTIVE As Long = STATUS_PENDING
 
Public Const PROCESS_QUERY_INFORMATION As Long = &H400
Public Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
 
Public Function myShell(CommandLine As String, Optional Timeout As Long, Optional WaitForInputIdle As Boolean) As Boolean
Dim proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
Dim i As Integer
Dim ret As Long
Dim nMilliseconds As Long
nMilliseconds = INFINITE
Start.dwFlags = 1
CreateProcessA 0&, CommandLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc
ret = WaitForSingleObject(proc.hProcess, nMilliseconds)
CloseHandle proc.hProcess
myShell = (ret = WAIT_OBJECT_0)
End Function
Форма:
Visual Basic
1
myShell ('rar.exe u <что> <куда>')
Насчёт фонового режима: в консольной версии (rar.exe) его нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2011, 20:53
Помогаю со студенческими работами здесь

Найти причины и решение проблемы: при запуске тестовой программы всё виснет на этапе компиляции (SFML 64 бит)
Привет всем. Задался целью поработать с библиотекой SFML в VSc++15 и никак не могу дать ладу его установке. В общем всё делаю как...

Виснет при запуске
Ув. Форумчане! Прошу ВАС помоч с курсовой... Программа повисает при запуске.#include &lt;vcl.h&gt; #pragma hdrstop ...

Есть форма, на ней поле и кнопка, при запуске программы в поле нужно ввести число и если оно 87, то открывается другое окно.
вобщем мне нужно зделать такую программу: есть форма, на ней поле и кнопка, при запуске программы в поле нужно ввести число и если оно 87,...

Код закрытия посторонней программы
Нужен код на закрытие сторонней программы или всех программ. Например из программы созданной на &quot;билдере&quot; нужно мне закрыть...

0x0000007E - при запуске, просто виснет и при нагрузке на видеокарту
Здравствуйте дорогие специалисты, прошу помочь разобраться в моей проблеме. Излазил множество форумов оверлокеров и т.п. схожесть проблемы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru