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

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

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

Author24 — интернет-сервис помощи студентам
Есть форма с кнопкой, таймером и статусбаром, в котором тикают часики (по указанному таймеру). При нажатии на кнопку запускается посторонняя программа (архиватор).
Проблема: пока работает архиватор, не тикают часики (виснут). Как только архиватор отработал – всё становится ОК.
Вопрос: как сделать так, чтобы часики не останавливались? Т.е. чтобы работали параллельно с архиватором.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2011, 22:41
Ответы с готовыми решениями:

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

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

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

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

11
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
03.08.2011, 10:42 2
Делай таймер через API.
Как? - используй поиск по форуму.
0
1 / 1 / 0
Регистрация: 01.05.2011
Сообщений: 203
05.08.2011, 22:30 3
А ты DoEvents не пробовал?
0
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 60
11.08.2011, 22:39  [ТС] 4
Пробовал.
Не помогло ни то, ни другое.
Попробуйте сами: положите на форму 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 5
Это может и да, но... если копировать файл по частям, то DoEvents какраз поможет.

Ты попоробуй архивировать файл по частям, ну тоесть взял кусок, заархевировал, записал, взял следующий, заархевировал, дописал к тому, взял следующий, заархевировал, дописал и т.д.
И какраз, после архивации 1 части твои часы будут обновляться.
И не забудь про DoEvents
0
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 60
12.08.2011, 11:27  [ТС] 6
А как это - 'по частям'?
А если нужно заархивировать целый каталог с 500 файлами?
Архивировать каждый файл в отдельности? Это же займёт раз в 10 больше времени!
0
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
12.08.2011, 23:40 7
Про копирование больших файлов.
Используйте код, потипа того, что ниже. Возможно, правда, я немного напутал с размером, там где проверка идет на конец файла, но не беда, посмотрите, если работать не будет. естественно есть смысл поиграться с размером буфера.
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 8
2pancer:
Хочешь асинхронности копирования - откажись от CopyFile в пользу SHFileOperation. Должно помочь. Или можно использовать CopyFileEx, и наращивание цифирь производить прям из callback-функции (и таймер на время копирования можно отключить).
Сам не пробовал, но один из этих вариантов по идее должен сработать.
Comanche
13.08.2011, 11:29 9
Кстати, в первоначальном варианте вопроса речь шла не о копировании, а о запуске некоего архиватора. А как именно он у тебя запускается?!
Сумрак
13.08.2011, 11:41 10
Ага. согласен с Команчи. По поводу запуска Архиватора.
Если РАР, он может запускаться в фоновом режиме. Может его с какими нить ключами запускать... Тогда он по идее не должен напрягать VB. Может в этом направлении поискать?
Comanche
13.08.2011, 12:09 11
Скорее всего, у него архиватор запускается с отслеживанием завершения (известный пример с OpenProcess и GetExitCodeProcess) - а там если делать цикл с DoEvents, то тормоза таймера будут неизбежны. Если же привинтить SetTimer, то анализировать GetExitCodeProcess можно не в цикле, а в таймерной функции, и в ней же (!) наращивать цифирки.

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

Модуль:
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
13.08.2011, 20:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2011, 20:53
Помогаю со студенческими работами здесь

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

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

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

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

Система при запуске виснет
Здравствуйте. Подскажите пожалуйста, что означают вот эти коды 0*00000001 (0*04050038.0*00000002....

Windows XP виснет при запуске
здравствуйте! У мена на ноуте призагрузне ос виснет сразу-же как высвечивается надпись windows, но...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru