![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем здрасте) подскажите что делаю не так.
Пишу код который сканирует, все логические диски, а затем выводит сообщение о найденных файлах пользователю. Процедура CreateWindow, я подписал, это создания формы и вывод информации о найденных файлах. Но после того как поиск завершен форма, промелькнет на доли секунды и пропадает, то есть даже не выводит всю информацию. Как исправить, чтобы она не пропадала, что делаю не так? Код:
procedure FindDrive;
var
DiskList: DWORD;
Drive: Char;
begin
DiskList := GetLogicaldrives;
Drive := 'a';
while (DiskList > 0) do
begin
case GetDriveType(Pchar(Drive + ':\')) of
3: FindFile(Drive + ':\');
end;
Disklist := Disklist shr 1;
Inc(Drive);
end;
CreateWindow;//Процедура создания и отображения формы WINAPI
end;P.S. А в процессах остается висеть, убирать приходится через taskmgr. |
|
#2
|
||||
|
||||
|
Возможно, что ваша форма - не главная в сборке, после создания она видимо скрывается, попробуйте добавить после этого ещё и form.show(modal)
|
|
#3
|
||||
|
||||
|
Скорее всего кривое использование WinAPI.
|
|
#4
|
|||
|
|||
|
проблема найдена, но появилась другая. Я использую поиск файлов в потоке, чтобы программа не зависла. Так вот делаю так:
Код:
var ThID: DWORD; ... BeginThread(nil, 0, @FindDrive, nil, 0, ThID); то есть запуск просто цикла поиска, форма в конце появляется без проблем а в потоке лишь мелькает. Как эту задачу решить? Без потока нельзя, чтобы не было зависания. Последний раз редактировалось Anton93, 10.06.2015 в 23:50. |
|
#5
|
|||
|
|||
|
Во первых, посмотри в msdn, какую сигнатуру должна иметь процедура, передаваемая третьим параметром в BeginThread.
|
|
#6
|
|||
|
|||
|
какой параметр нужно передавать?
Код:
BeginThread(nil, 0, @FindDrive, здесь передаешь нужный указатель для обращению к нему из потока, 0, ThID); Код:
procedure FindDrive;
var
DiskList: DWORD;
Drive: Char;
begin
DiskList := GetLogicaldrives;
Drive := 'a';
while (DiskList > 0) do
begin
case GetDriveType(Pchar(Drive + ':\')) of
3: FindFile(Drive + ':\');
end;
Disklist := Disklist shr 1;
Inc(Drive);
end;
CreateWindow;//Процедура создания и отображения формы WINAPI
end;Посоветовали из процедуры procedure FindDrive; сделать функцию, Код:
function FindDrive(Param: Pointer): Integer; |
|
#7
|
||||
|
||||
|
Код:
function trheadproc(p: pointer): cardinal; stdcall |
|
#8
|
|||
|
|||
|
Цитата:
|
|
#9
|
||||
|
||||
|
это так должна выглядеть ф-я, которая передается в createthread
|
|
#10
|
||||
|
||||
|
всегда было
Код:
Classes
function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
{$IFDEF LINUX}
if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF}
try |