Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi 2

Автор: RffR255
Дата сообщения: 02.10.2006 22:41

Цитата:
как быстрее добавить в базу Access несколько тысеч записей (в одну табличку)?


А откуда добовляемые данные беруться? Как формируются?
Автор: andead
Дата сообщения: 02.10.2006 23:45
RffR255
данные формируются самой программой, точнее это характеристики media файлов
Автор: OdesitVadim
Дата сообщения: 03.10.2006 12:53
andead
Я бы через сиквел запрос закинул. Только перед началом заброса стартанул транзакцию - выиграл немного времени. При работе с Access через ADO посредством SQL запросов получается нескоко тысяч запросов в секунду, что приемлемо в данном случае.
Автор: DroN_S
Дата сообщения: 03.10.2006 16:37

Цитата:
Я бы через сиквел запрос закинул. Только перед началом заброса стартанул транзакцию - выиграл немного времени. При работе с Access через ADO посредством SQL запросов получается нескоко тысяч запросов в секунду, что приемлемо в данном случае.

какую то ахинею написал...
откуда беруться данные? если из какой то таблицы, то просто INSERT INTO и SELECT...
если же просто из текстового файла, то сначала тебе данные надо будет делать парсер данных с последующем их заненсение в таблицу
Автор: OdesitVadim
Дата сообщения: 03.10.2006 16:52
DroN_S
Человек же написал

Цитата:
данные формируются самой программой, точнее это характеристики media файлов

Это ответ на

Цитата:
откуда беруться данные?

Судя с этого, это врядли

Цитата:
если из какой то таблицы

И в добавок, человек спросил "как".
Поэтому, фразу
Цитата:
какую то ахинею написал...

можно расценивать как оскорбление.
Автор: RffR255
Дата сообщения: 03.10.2006 16:53

Цитата:
данные формируются самой программой, точнее это характеристики media файлов


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

Автор: DroN_S
Дата сообщения: 03.10.2006 17:32

Цитата:
При работе с Access через ADO посредством SQL запросов получается нескоко тысяч запросов в секунду

такое может быть быть если запрос будет отправляться SQL Server'у но никак не на локальной машине... тут всё производительность зависит от характеристик самой такчки...
Цитата:
можно расценивать как оскорбление.

на счёт этого, оскорблять тебя никто не собирался, просто то что ты написал, очень трудно воспринимается очень трудно разобрать.. выясняйся проще...
Автор: rs
Дата сообщения: 03.10.2006 21:11
в ntfs файл может содержать более одного потока данных, операционная система показывает обычно только один из них

как в дельфи можно писать в отдельные ntfs-потоки одного файла? соответсвенно и читать?
Автор: Dmitry
Дата сообщения: 03.10.2006 22:37
rs
вот здесь можно помотреть - _hxxp://www.test-lab.ru/modules.php?name=Articles&file=view&articles_id=19
Автор: andead
Дата сообщения: 04.10.2006 01:24
...
как в DBGridEh заставить работать STFiler с базой Access? фильтр появляется но при выборе значения ничего не происходит, работает связка: DBGridEh - DataSource - MemTableEh - DataSetDriverEh - ADOQuery - ADOConnection
в uses прописан EhLiBADO как сказанно в хелпе
и +
initialization
DBGridEhDefaultStyle.FilterEditCloseUpApplyFilter := True;
Автор: DroN_S
Дата сообщения: 04.10.2006 06:46
andead
а ты не пробывал ручками фильтрацию делать, а не всё скалдывать на компонент?
Автор: deadbitch
Дата сообщения: 04.10.2006 09:16
wader

Цитата:
deadbitch
Ага, из метафайла.

вот примерный код:
Исходник


О, спасибо! Работает быстрее всех предыдущих вариантов, даже с полноцветными градиентными EMF, супер! big thnx!!
Автор: Saxonika
Дата сообщения: 04.10.2006 13:06
Привет всем!

Ребята помоги мне пожалуйста. У меня такой головной боль. Не знаю как побороть...

Мне нужно запустить программу так, чтобы она не знала о существовании родительского процесса.
Как запустить программу от имени операционной системы? и долждаться её окончания.

Как я это делаю и зачем всё это:

1) есть программа, назовём её "не-моя" (буржуйские корейцы написали)

2) эта программа "не-моя" работает в комплексе с другими программами "не-моими", но может быть запущена и самостоятельно без остальных программ (хотя вроде как это и не предусмотрено, но весь комплекс разбит на части по программам и эти программы просто работают по цепочке передавая другу другу информацию).

3) если программу "не-мою" запустить из-под explorer или того же far, то программа "не-моя" всё правильно делает, производит все необходимые операции, генерирует и сохраняет результат, а по окночанию чудно и великолепно выходит.

4) если программу "не-мою" запускаю из-под своей программы, то программа "не-моя" опять всё чудно делает, всё на ура, но ... в конце она виснет !!!!

Я сделал такое предположение, что программа "не-моя" просто определяет родительский процесс и если таковой найден, то она считает, что это одна из программ комплекса и пытается с ней в конце своей работы как-то взаимодействовать, ну типа сообщить ей о результате своей работы (и потому вовсе она не виснет, а просто ждёт что родительский процесс чего-то ей сообщит). Но о том как происходит это взаимодействие я не знаю и инфы никакой нет.

Запускаю я всё это достаточно стандартно...


Код:

var
si: TStartupInfo;
pi: TProcessInformation;

begin

FillChar(si, SizeOf(si),0);
si.cb := SizeOf(si);
FillChar(pi, SizeOf(pi),0);

if CreateProcess(PChar('ProgramToRun.exe'), nil,
nil, nil,
false,
CREATE_NEW_CONSOLE or // creation flags
NORMAL_PRIORITY_CLASS,
nil,
nil,
si,
pi)
then
begin
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end
else
MessageDlg(SysErrorMessage(GetLastError), mtError, [mbOK], 0);
end;
Автор: wader
Дата сообщения: 04.10.2006 13:25
Saxonika
Запусти ее чере ShellExecute
Автор: Saxonika
Дата сообщения: 04.10.2006 16:57
Я уже пробовал и ShellExecute тоже. Моему горю оно не помогло.

Делал опять же вроде всё стандартно...

Код:

var SEI:TShellExecuteInfo;

begin

ZeroMemory(@SEI,sizeof(SEI));
SEI.cbSize:=sizeof(SEI);

SEI.fMask:=SEE_MASK_NOCLOSEPROCESS;
SEI.Wnd:=Application.Handle;
SEI.lpVerb:='open';
SEI.lpFile:=PChar('ProgramToRun.exe');
SEI.nShow:=SW_SHOWDEFAULT;

if ShellExecuteEx(@SEI) then WaitForSingleObject(SEI.hProcess,INFINITE);
end;

Автор: andead
Дата сообщения: 04.10.2006 17:08
DroN_S

Цитата:
а ты не пробывал ручками фильтрацию делать, а не всё скалдывать на компонент?

ну если в компаненте реализованно, значит нада юзать =) да и неохота для 20 полей делать фильтр, в DBGridEh гораздо симпатичнее
Автор: Ramazan
Дата сообщения: 04.10.2006 17:14
Saxonika
А с использованием команды START не пробовал?
Автор: wader
Дата сообщения: 04.10.2006 18:53
Saxonika
Попробуй вот так: ShellExecute(0,nil,'ProgramToRun.exe',nil,nil,SW_SHOWNORMAL)
Для чего ShellExecuteEx используешь? и вот это WaitForSingleObject зачем?
Чего ты добится хочешь?
Автор: Saxonika
Дата сообщения: 04.10.2006 20:28
А что это за команда START? это откудаво? В командной строке такая не запускается..

Пробовал я и ShellExecute - таже история. То что ParentWindow=0 ничо не даёт.

Процедуру WaitForSingleObject я использую чтобы дождаться окончания выполнения "ProgramToRun.exe". Она вроде как стандартная и используется в WinApi для этих целей.

Мне нуно дождаться окончания выполнения !!!

Если бы не нуно было дожидаться окончания выполнения, я бы просто Shell.Open('ProgramToRun.exe') - и всё! все проблемы решены. Я проверял. Работает на ура.
Но в этом случае программа отрывается и уходит в свободное плавание.
Автор: RomanTim
Дата сообщения: 04.10.2006 22:10
Saxonika

Цитата:
Мне нуно дождаться окончания выполнения !!!

В качестве альтернативы WaitForSingleObject можно периодически проверять - запущен ли еще соответчтвующий процесс. Метод конечно не самый красивый, но при условии единственности такого процесса вполне может сработать
Автор: DroN_S
Дата сообщения: 05.10.2006 08:57

Цитата:
ну если в компаненте реализованно, значит нада юзать =) да и неохота для 20 полей делать фильтр, в DBGridEh гораздо симпатичнее

а в чём составляет собствено проблема то????
Автор: RostY
Дата сообщения: 05.10.2006 09:56
Saxonika
когда-то я делал так: _http://rapidshare.de/files/35552015/LAUNCH.RAR.html
Автор: RomanTim
Дата сообщения: 05.10.2006 13:04
RostY

Цитата:
когда-то я делал так

Посмотрел твой код. Через ShellExecuteEx у Saxonika не работает, а с ShellExecute так не получится. В MSDN написано

Цитата:
The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.

Автор: DroN_S
Дата сообщения: 05.10.2006 14:00
RomanTim
CreateProcess???
Автор: RomanTim
Дата сообщения: 05.10.2006 14:09
DroN_S

Цитата:
CreateProcess???

Ты о том, что можно через CreateProcess запускать? Почитай выше - у человека прога при запуске через CreateProcess или ShellExecuteEx с последующим WaitForSingleObject зависает, при простом ShellExecute вроде нет, а ему надо узнать когда она завершится
Автор: DroN_S
Дата сообщения: 05.10.2006 14:14
а через WinExec нормально работает?
Автор: Erazer
Дата сообщения: 05.10.2006 19:56
Памагите решить такую проблемку:
Есть главная форма, есть дочерняя форма на которой TGauge который призван отображать состояние процесса, и кнопка отмена для прервывания процесса.
Хочется сделать так чтобы пока не нажата кнопка отмена до основной формы добраться было нельзя, если я вывожу дочернюю через showmodal, то стоит процес который должен происходить, я так понимаю ждет ответа от закрытия модальной формы.
Как быть чтобы и процесс шел, и доступной была только дочерняя форма с результатами?
Автор: EZH
Дата сообщения: 05.10.2006 20:07
Erazer
Выводи сам процесс в отдельный поток (TThread) и через Synchronize выводи текущие результаты его работы в форму (т.к. VCL компоненты не безопасны для многопоточного использования). Тогда таких проблемок не будет возникать.
Автор: Erazer
Дата сообщения: 06.10.2006 14:05
EZH
пасибочки, мне недавно тут кодеры под .net одну мысль подсказали "Мыслить нужно абстрактно" ну это так к слову, а проблему я решил так: дочернюю форму оставил обычной , не модальной и дописал пару строчек
"ProgressForm.Show; MainForm.Enabled:=False;
.....................................................................
ProgressForm.Close; MainForm.Enabled:=True;" как гоорится все гениальное просто
теперь другой вопрос... нужно удалить из папки все файлы...
использую для этого function DeleteFiles(Handle: Hwnd; FolderToClear: string; ToRecycle: Boolean):
Integer;
var
SHFileOpStruct : TSHFileOpStruct;
begin
PChar(FolderToClear);
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_DELETE;
pFrom := Pointer(FolderToClear);
pTo := nil;
fFlags := 0;
if ToRecycle then
fFlags := FOF_ALLOWUNDO;
fFlags := FOF_NOCONFIRMATION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
Result := SHFileOperation(SHFileOpStruct);
end;
НО есть 1 проблема , если в названии папки включенной в путь есть хоть 1 пробел - не работает говорит что не удается произвести чтение с диска и т.д. и т.п. - не работает короче.
Т.е. если удалять из папки "D:\test\*.*" - работает , а из "D:\te st\*.*" нет.
а мало ль как юзер папку обзовет ? есть же пример "C:\Program Files\" здесь оно тож работать не будет...
Шо делать ?
Автор: RedPromo
Дата сообщения: 06.10.2006 14:35
Erazer
А с флагами ты немножно недобрал
вот поставь такие и все будет ОК

Цитата:
fFlags := FOF_FILESONLY + FOF_ALLOWUNDO + FOF_SILENT + FOF_NOCONFIRMATION;

Если хочеш исключать то FOF_ALLOWUNDO убери под условие.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.