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

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: NOwlar
Дата сообщения: 14.09.2009 11:03
SerBUser

Цитата:
Хм. А в статье было написано - или пишем обработчики OnStart/OnStop или обработчик OnExecute. Т.е. я правильно понял, что надо в OnExecute и прописывать те действия, которые мне надо выполнить по таймеру, а таймер убрать совсем и код будет примерно такой:

Ну как-то так. Таймер тоже будет работать если в OnExecute будет просто пустой цикл с ProcessRequests( True );

Цитата:
А как его запустить? Можно примерчик?

Кстати, если обработчик OnExecute вообще не определять - то тогда сервис тоже будет работать должным образом, но как раз в этом случае нужно в OnStart запускать свой поток. То есть надо создать экземпляр класса, например TMyServiceThread, наследника TThread с переопределённым методом Execute, в котором совершать нужные действия.
Автор: SerBUser
Дата сообщения: 15.09.2009 02:29
NOwlar
Все, спасибо всем - выкрутился. Просто создал новое приложение (не сервис), в котором кинул таймер и делаю все, что мне нужно и отлаживаю как приложение - очень удобно. А в службе просто подрубил его и код выглядит теперь проще не бывает:

Код:
uses
SvcMgr,
Unit1 in 'Unit1.pas' {Service1: TService},
Unit2 in 'Unit2.pas' {pas-файл приложения};
Автор: mdid
Дата сообщения: 15.09.2009 20:18
есть форма с виз. компонентами как скопировать форму и все ее содержимое в новый объект TForm?
что то типа

Код:
form:TForm;
form:=tform.create(self);
Автор: Hiken
Дата сообщения: 15.09.2009 20:35
mdid
Если я вас правильно понял: вот здесь видел похожий вопрос, там же есть и ответ на него. Вкратце: либо создавайте еще один экземпляр этой же формы, либо используйте Frames.
Автор: mdid
Дата сообщения: 15.09.2009 20:57
Hiken
понял...пасиб...за все время что программлю в делфи на Frames даже внимания не обращал
Автор: Grande
Дата сообщения: 16.09.2009 08:03
Уважаемые знатоки, столкнулся вот с такой проблемой:

Передающее приложение

Код:
type
TParams = Record
IniString1 : ShortString;
IniString2 : ShortString;
Answer1 : ShortString;
Answer2 : ShortString;
IP_Port : Integer;
Job : Integer;
end;

procedure Sender;
var
SendRecord: TParams;
aCopyData: TCopyDataStruct;
hReceiver: Cardinal;
MsgToSend: ShortString;
begin
SendRecord.IniString1 := 'IniString1';
SendRecord.IniString2 := 'IniString2';
SendRecord.Answer1 := 'Answer1';
SendRecord.Answer2 := 'Answer2';
MsgToSend := 'Message';
with aCopyData do
begin
dwData := 0;
cbData := StrLen(MsgToSend) + 1;
lpData := @SendRecord;
end;
SendMessage(hReceiver, WM_COPYDATA, LongInt(hMyApp), LongInt(@aCopyData));
end;
Автор: ShIvADeSt
Дата сообщения: 16.09.2009 08:11
Grande
1) cbData - Specifies the size, in bytes, of the data pointed to by the lpData member.
а у тебя там какая то ерунда написана. По идее должно быть так

Цитата:
with aCopyData do
begin
dwData := 0;
cbData := SizeOf(TParams);
lpData := @SendRecord;
end;

я проверил у меня все нормально ушло.
Автор: GPSGURU
Дата сообщения: 16.09.2009 08:25
Хочу спросить совета.
Делаю небольшой софт для компании. Все данные храню в record - переменной, которая в свою очередь состоят из record-переменных, динамич. массивов и др. Т.е. обратиться к любому параметру можно: Prog.{1-й раздел}.{2-й раздел}... и так далее, с произвольной глубиной вложений.
Теперь сам вопрос: если данные будут изменяться различными потоками, нужно ли мне делать это через criticalsection. Если да, то из-за того что все в куче не получится ли так, что возникнут разные коллизии?
Автор: Grande
Дата сообщения: 16.09.2009 08:30
ShIvADeSt

Ну, что сказать... Лохонулся по полной - такая досадная ошибка
Спасибо огромное, заработало.
Автор: Hiken
Дата сообщения: 16.09.2009 09:10
GPSGURU
Да, например синхронизировать можно через критические секции. Если данных много, и обращение к ним из разных потоков будет происходить часто-часто, то одной критической секции на весь массив будет недостаточно: нужно делить данные на страницы. И очевидный момент: находиться в критической секции следует как можно меньше: считали запись во временную переменную - вышли, обрабатываете, когда надо записывать, и только тогда - заходите снова.
Автор: GPSGURU
Дата сообщения: 16.09.2009 10:28
Спасибо огромное. Так и сделаю. А если одна критическая секция "забирает" один кусок record-переменной, в это же время другая сможет "забрать" другой кусок? Или она ждет пока не закончит свои дела первая? Т.е. если одна критическая секция заберет маленький параметр на самой верхушке всего дерева, остальные будут в это время доступны или блокируется вся record-переменная?
Автор: Hiken
Дата сообщения: 16.09.2009 10:38
Ну что значит кусок? Если вы хотите, чтобы можно было одновременно в двух потоках обрабатывать две половины одной записи, и при этом не было порчи данных, то нужно использовать две критические секции, на каждую половину этой записи. Выходит по два объекта синхронизации на каждую запись - надо бы упростить, уменьшить их число. Или довольствоваться единственным на весь массив, или порезать на страницы и ассоциировать с каждой из них один объект: мьютекс, семафор, или же критическую секцию.
Автор: nkurrich
Дата сообщения: 16.09.2009 11:45
могите с перехватом клавиш, то есть например при запуске программы, при нажатии Enter должна работать процедура, и сочетания клавиш тоже если можн опишите=)заранее спс
Автор: Hiken
Дата сообщения: 16.09.2009 11:55
nkurrich
Используйте WinAPI функцию GetKeyState, например:


Код: if GetKeyState(VK_ENTER) < 1 then
// ENTER нажата
else
; // НЕ нажата
Автор: nkurrich
Дата сообщения: 16.09.2009 12:11
Цитата:
и сочетания клавиш тоже если можн опишите

Чего-чего?


ну например мне надо, чтобы при нажатии СtrL+Enter происходило определенное действие
Автор: Hiken
Дата сообщения: 16.09.2009 12:31
nkurrich
Раз задача стоит именно так: что мешает два раза вызвать GetKeyState? Чтобы узнать Virtual-Key-коды всех клавиш, смотрите одноменный топик "Virtual-Key Codes" в Platform SDK.
Автор: ShIvADeSt
Дата сообщения: 16.09.2009 14:22
Hiken

Цитата:
Чтобы узнать Virtual-Key-коды всех клавиш

Чтобы узнать коды я набираю например VK_RETURN потом зажимаю контрол и кликаю на это слово. Перехожу в соотв файл описаний и смотрю что же я еще не помню
Автор: Hiken
Дата сообщения: 16.09.2009 14:27
ShIvADeSt
А как же цифро-буквенные клавиши? Для них не определены константы, вот и приходится соответствующий им число-код вводить.
Автор: ShIvADeSt
Дата сообщения: 16.09.2009 14:39
Hiken

Цитата:
А как же цифро-буквенные клавиши? Для них не определены константы, вот и приходится соответствующий им число-код вводить.

Константы не определены, но значения там описаны. Если память не изменяет Ord от символа (я просто не сравнивал значения и результат орда).
Автор: andrewtishkin
Дата сообщения: 17.09.2009 15:34

Цитата:
А как же цифро-буквенные клавиши?

Английские буковки, циферки и прочие виртуальные клавиши в MSDN описаны...
http://msdn.microsoft.com/en-us/library/dd375731(VS.85,loband).aspx
Или я не о том?

Добавлено:

Цитата:
но значения там описаны.

+1

Код: { VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
Автор: GPSGURU
Дата сообщения: 17.09.2009 19:14
Раньше я начинал вводить какую-либо функцию, затем нажимал Ctrl+Space и получал список возможных функций, начинающихся с тех букв, которые я ввел. Но потом что-то я сделал, что эта возможность пропала. Как ее вернуть?
Автор: Granmer
Дата сообщения: 17.09.2009 19:59
При помощи чего можно сделать "индикатор загруженности" приложения, когда оно выполняет длительную задачу и не отвечает?
Например, чтобы в статус баре окна крутился кружок, пока приложение не отвиснет. У меня получилось отобразить загрузку в момент выборки/обработки данных в БД. А вот потом, если массив большой и его надо отрисовать в таблицу, то приложение подвисает на несколько секунд. Грузятся данные в девэкспрессную гриду.
Можно и не в статус бар... Наверное вопрос избитый, но я пока подходящего решения не нашел.
Автор: data man
Дата сообщения: 17.09.2009 20:06
Granmer
Не оно ?

Цитата:
Окно отображающее ход выполнения длительной операции

http://delphikingdom.ru/asp/viewitem.asp?catalogid=1169
Автор: volser
Дата сообщения: 17.09.2009 20:29
GPSGURU
Какая delphi?
Автор: GPSGURU
Дата сообщения: 17.09.2009 20:38

Цитата:
Какая delphi?

2009-я
Автор: Hiken
Дата сообщения: 17.09.2009 20:52
GPSGURU
Смотрите настройки в разделе Tools -> Options -> Editor Options -> Code Insight.
Автор: GPSGURU
Дата сообщения: 17.09.2009 21:07

Цитата:
Смотрите настройки в разделе Tools -> Options -> Editor Options -> Code Insight.

Не помогает. ЧТо делать?
Автор: Frodo_Torbins
Дата сообщения: 17.09.2009 21:25
GPSGURU
CnWizards случайно не стоят, они на это могут влиять? Хотя у меня с ними никогда проблем не было.
Автор: GPSGURU
Дата сообщения: 17.09.2009 21:41
CnWizards не стоят. Причем проблема наблюдается только в одном проекте. Все другие работают нормально.
Автор: Granmer
Дата сообщения: 17.09.2009 21:46
data man
Тоже думал про использование потоков, но надеялся, что можно как-нибудь по-другому. Спасибо за пример!

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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