Здравствуйте, господа эксперты! Please, HELP me! Срочно нужно разобраться с одной задачей. Мне нужно запустить ЕХЕ-фаил из своей многопоточной программы (то есть, чтобы они обе работали нормально, обрабатывали данные, ...). Первая должна подождать завершения второй и вернуть код выхода второй приложении (мне очень нужно знать, как оно завершилось). И вот что здесь не работает: в процедуре ThreadFunc si, pi, pi.hProcess, pi.hThread не принимают почему-то никакого значения. Ни одна из GetExitCode (Process, Thread) ничего не возвращают. Помогите, пожалуйста, разобраться, очень нужно. Заранее благодарю. procedure TForm1.CreateThreadButtonClick(Sender: TObject); var dwThreadId,dwThrdParam:DWORD; Thread:cardinal; Exit_Code_Thread:cardinal; si:^STARTUPINFO; pi:^PROCESS_INFORMATION; Exit_code:cardinal; Procedure
ThreadFunc; label Error_CreateProcess; begin si:=AllocMem(sizeof(STARTUPINFO)); si.cb:=sizeof({STARTUPINFO}si); pi:=AllocMem(sizeof(PROCESS_INFORMATION)); if not CreateProcess(nil,'D:My projectsSchedullerMain programm-2ProceduresParams.exe /all ofDeathMetal', nil, nil, FALSE, NORMAL_PRIORITY_CLASS, nil, nil, si^, pi^) then begin label3.caption:='Error - File not started.'; goto Error_CreateProcess; end; WaitForSingleObject(pi.hProcess,INFINITE); GetExitCodeProcess(pi.hProcess,Exit_code); //PostMessage(form1.Handle,Wm_Finished,0,0); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); label3.caption:=inttostr(Exit_code); GetExitCodeThread(Thread,Exit_Code_Thread); EndThread(Thread); label3.caption:=inttostr(Exit_Code_Thread); Error_CreateProcess: end; begin Thread:=BeginThread(
nil, // default security attributes 0, // use default stack size @ThreadFunc, // thread function nil, // argument to thread function 0, // use default creation flags dwThreadId); // returns the thread identifier if (Thread=NULL) then begin MessageDlg('Error - no another Thread',mtError,mbOKCancel,0); end else begin // end; end; ================================================== А вот это процедура работает нормально, возвращает все как положено. Но оно не гадиться, блокирует приложение (ждет выхода из второй) procedure TForm1.CreateProcessButtonClick(Sender: TObject); label Error_CreateProcess; var si:^STARTUPINFO; pi:^PROCESS_INFORMATION;
Exit_code:cardinal; begin si:=AllocMem(sizeof(STARTUPINFO)); si.cb:=sizeof({STARTUPINFO}si); pi:=AllocMem(sizeof(PROCESS_INFORMATION)); if not CreateProcess(nil,'D:My projectsSchedullerMain programm-2ProceduresParams.exe /all ofDeathMetal', nil, nil, FALSE, NORMAL_PRIORITY_CLASS, nil, nil, si^, pi^) then begin label1.caption:='Error - File not started.'; goto Error_CreateProcess; end; WaitForSingleObject(pi.hProcess,INFINITE); GetExitCodeProcess(pi.hProcess,Exit_code); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); label1.caption:=inttostr(Exit_code); Error_CreateProcess: end; ================================================== На всякий случай оставляю email: dyma@newmail.ru
Приветствую Вас, Dyma! По 2-му - Вы же сами написали "ждать бесконечно": WaitForSingleObject(pi.hProcess,INFINITE); Задайте время и закройте. Не обязательно ждать завершения, если Вы не хотите, чтоб та программа блокировала Вашу. Просто перед завершении она может послать сообщение первой с помощью SendMessage (PostMessage) WM_USER+число. Когда получите сообщение - читайте, что надо По 1-му: УРА! впервые вижу живые метки в Delphi!! Не тестировал, но возможно, причина в том, что, запуская в дочерном потоке, указали bInheritHandles = FALSE? Но мне кажется, что поступая так, как выше - Вы решите проблему Ответ отправлен: 25.03.2004, 15:24 Отправитель: Boriss
Вопрос № 1434
Доброго времени суток ! Я пишу программу тов-мат учета (Д7 FB IB&Linux). При оформлении накладной выпадает список категорий документа, где в каждой записи прошита формула вычисления проводок типа : (поле9-поле1)*10-поле12. На FoxPro 6.0 все работает без сучка, но как реализовать этот метод в дельфях под IB ума не приложу. Можно, конечно написать навороченный интерпретатор формул, но желательно какое-нибудь изящное решение. Ваше мнение, господа ?
Приветствую Вас, jiny! Есть для этого волшебное средство - называется ЗАПРС (SELECT). Вот как это будет выглядеть: SELECT (поле9-поле1)*10-поле12 AS название FROM таблица Если я правильно понял вопрос :). А как у Вас на FoxPro работало? Наверняка в Дельфи можно сделать так-же. Ответ отправлен: 23.03.2004, 13:35 Отправитель: sir henry
Вопрос № 1435
Вопрос насчет БЛОКИРОВОК в IB : как более оптимально осуществлять блокировку в таблицах. Пробовал в таблицах добавлять поля UserLock, UserLockTime, но, как обычно, местные юзеры умудрились попасть в шанс 1 из 100 и одновременно отрыли для апдейт метода одну и ту же запись. Как это осуществляется на уровне компоненты IbTransaction(какие параметры выставлять) ? в params у меня сейчас стоит : read_commited rec_version write nowait
Здравствуйте, jiny! Попробуйте, прежде чем давать доступ для апдейта, проверять TIBTransaction.InTransaction. Если True, значит транзакция незакончена (например, происходит изменение записи). Ответ отправлен: 23.03.2004, 13:47 Отправитель: sir henry
Вопрос № 1436
Спасибо sir henry, но возник еще одын вопрос, вытекший из вопроса №1434 : как сделать так, чтобы в поле было имя формы, следующ. - имя компоненты и как программно туды получить контрол ?
Доброе время суток, jiny! Хм.Отвечаю, хотя не уверен, что правильно понял :). У компонента, с помощью которого посылается запрос на IB-сервер (TIBQuery) есть свойство для заталкивания параметров в запрос (TIBQuery.Params[Index] - массив параметров для запроса). Параметры в запросе используются так: :Имя_параметра (т.е. с двоеточием в начале). Во время работы программы значения в параметры запроса заносятся так: TIBQuery.Params[1].AsString:=строковая_переменная; или TIBQuery.ParamByName('Имя_параметра').AsString:=строковая_переменная; Перед тем, как заносить значения в параметры, запрос нужно закрыть: TIBQuery.Close; после присвоения значений параметрам заново открыть: TIBQuery.Open; Ответ отправлен: 23.03.2004, 15:54 Отправитель: sir henry
Вопрос № 1437
Я благодарю Sir Henry за ответы и терпение, в действительности, я немного неправильно сформулировал свой вопрос насчет формул в полях таблицы типа (поле1-поле2)*поле6, вот как обстоит ситуация на самом деле : Накладная состоит из 2-х таблиц : 1-я(А) это шапка накладной, где указаны данные документа(проводки, клиент, дата и прочее), 2-я таблица(Б) - это список товаров к накладной. Так вот, при создании накладной, схема следующая : 1) выбираются : клиент, дата, КАТЕГОРИЯ документа(где указаны проводки с формулами, по которым расчитывать проводку) и проч., все загоняется во временную форму. 2) временно создается таблица для списка, причем она является полной копией таблицы "Б", так вот после закрытия наборной формы, должны пересчитать проводки, исходя из суммы, вот конкретный пример, того что должно получится
: - формула 1-ой проводки sum_sd-ndc-sum_skd(это поля таблицы "А") - запись в таблице "А" еще не добавлена(все в памяти) - есть клон таблицы "Б" где есть данные списка, но чтобы получить такие же поля как и в табл."А" нужно что-то типа select sum(kol*cost_sd) as sum_sd and etc. а куда здесь "впихнуть" формулу указанную выше ?!!! И как моно сделать иначе ? Тем более что, если я попробую как-то использовать sum_sd, то мне вежливо дадут понять "анноун колумн") Надеюсь на вашу профессиональность.
Добрый день, Jiny! Честно признаюсь - запутался окончательно. Видно бухгалтерия не мой профиль :)). Попробуйте составить выборку из двух таблиц (А и Б), составив правильное условие выборки, что-то типа: SELECT (поля, которые нужны в результате, в том числе вычисляемые. В зависимости от того, в какой таблице находится поле, перед ним ставится навзвание таблицы с точкой) FROM А, Б WHERE А.дата = нужная_дата AND А.клиент = нужный_клиент AND Б.товар = нужный_товар ------------------------------- Я полагаю, что должна быть какая-то оперативная таблица, куда заносятся данные текущей сделки с клиентом: код клиента, код товара, его количество, дата сделки и т.п. текущая информация, которая полностью описывает сделку. Было бы разумно расчет проводить именно по полям такой оперативной таблицы. ------------------------------- Можно попробовать
создать таблицу-справочник, где в колонке с типом CHAR содержаться строки запроса. По результатом проверки того или иного условия строка запроса переноситься в компонент запроса (TIBQuery) и выполняется. Не думаю, что формул с расчетом проводок у Вас бесконечное количество :)). Ответ отправлен: 24.03.2004, 13:00 Отправитель: sir henry
Вопрос № 1438
Здраствуйте. Мне нужно загрузить gif рисунок, как можно это сделать(может нужен какой либо компонент например image)? (Delphi6)
Добрый день, Том! Поищите в интернете, там их много. Ответ отправлен: 24.03.2004, 22:40 Отправитель: Pawel Отвечает Boriss
Доброе время суток, Том! Для использования анимированных GIF можно оспользоваться компонентом RxGifAnimator, входящим в комплект RxLib. Кое-что есть на http://www.lawrenz.com/coolform/download.htm Еще http://www.torry.net/quicksearchd.php?SID=7382478ad9f67dba5c17f26087de663a&String=gif&Title=Yes Ответ отправлен: 25.03.2004, 16:16 Отправитель: Boriss Отвечает THE_PRO
Здравствуйте, Том! Nujni isxodniki Ответ отправлен: 25.03.2004, 15:07 Отправитель: THE_PRO Отвечает CJ
Добрый день, Том! Да, для этого нужен компонет поддерживающий gif. Ответ отправлен: 24.03.2004, 22:21 Отправитель: CJ Отвечает sir henry
Приветствую Вас, Том! Вот адрес, по которому можно скачать компоненту для загрузки разных форматов, в том числе и gif: http://www.delphimaster.ru/cgi-bin/download.pl?get=1053598165&n=1 Зайдите еще на www.torry.net, там тоже много интересного. Ответ отправлен: 25.03.2004, 09:48 Отправитель: sir henry
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.