![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TSocketConnection - познее связывание - - в другом потоке. [D7, WinXP]
tytus © (2007-07-03 10:22:00)Доброго дня мастера. Вот собственно и тема - хочу выполнять методы сервера в отдельном потоке+показать форму выполнения.
В главном приложении есть TSocketConnection (Connect1) и TClientDataSet (CDS1).
В конструкторе потока передаю и Connect1 и CDS1.
...
Constructor WaitThread.Create(AConnect:TSocketConnection;ADataSet:TClientDataSet);
begin
FConnect:=AConnect;
FDataSet:=ADataSet;
inherited create(false);
end;
procedure Execute;
begin
FConnect.AppServer.МойМетод;
end;
вот на такой код делфи ругаеццо:EVariantInvalidArgError,
а если запускать екзешник - то Error reading from Socket.
Как правильно сие сделать...
ага (2007-07-03 14:43:00) [21]to Сергей М. ©
Я вот про ето:
"Сергей М. © (03.07.07 11:42) [4]
> нереально передать в поток уже подключенный SocketConnection?
Реально. Криминала никакого в этом нет."
Можна - покажи как.
>>>TSocketConnection использует свой собственный маршаллинг.
Ага. Для передачи через свое сокетное соединение и тока. Притом еще всякие объекты создает, списки заполняет, и без всякой межпоточной синхронизации.
Сергей М. (2007-07-03 14:12:00) [22]
> ага (03.07.07 13:54) [22]
>
> Да низя так делать
Можно.
TSocketConnection использует свой собственный маршаллинг.
ага (2007-07-03 13:54:00) [23]Да низя так делать. Можно тока маршальнуть интерфейс в другой поток, и то тоrа при STA, да вот толку с того чуть, вызов все одно пойдет через майн нить.
Сергей М. (2007-07-03 13:49:00) [24]
> тоже самое правится в RDM_TLB
Редактор при манипуляциях с интерфейсами делает синхроннуюправку сразу двух юнитов - RDM и TLB. На то он и предоставлен разработчиками.
Зачем же делать это ручками, если это чревато ошибками, тем более когда знаний на эту тему не хватает ?
tytus (2007-07-03 13:44:00) [25]>Сергей М. © (03.07.07 13:36) [19]
списобо за книгу, будем посмотреть...
>Сергей М. © (03.07.07 13:30) [18]
редактор сам
дык... тоже самое правится в RDM_TLB...
Сергей М. (2007-07-03 13:36:00) [26]
> или книгу какую по-вразумительнее
Эрик Хармон, "Разработка COM-приложений в среде Delphi"
Сергей М. (2007-07-03 13:30:00) [27]
> да нет же не кирилицей есессно
Ну а что ж тогда про иероглифы [8] начал ?)
> как правильно выполнять методы сервера в другом потоке через
> позднее связываение
1. Методы диспинтерфейса должны иметь соглашение о вызове safecall
2. Добавлять методы нужно не через анус (Edit -> Add to interface), а специально существующими на то средствами редактора библ-ки типов (New -> Method/Property) - редактор сампроизведет все необходимые изменения в RDM-юните.
tytus (2007-07-03 13:18:00) [28]>Anatoly Podgoretsky © (03.07.07 13:12) [16]
-))
tytus © (03.07.07 13:03) [13]
Anatoly Podgoretsky (2007-07-03 13:12:00) [29]> чтоб не вводить в заблуждение названием реальных методов
Да ну
tytus (2007-07-03 13:07:00) [30]>Сергей М. © (03.07.07 13:04) [14]
tytus © (03.07.07 13:03) [13]
Сергей М. (2007-07-03 13:04:00) [31]
> Затем Edit->Add to interface и вписываю сию процедурку
Да щщас !
А это что
"... invalid character #204 found"
?
Эта ошибка ЗАКОНОМЕРНА. если твой метод называется "Мойметод"
tytus (2007-07-03 13:03:00) [32]>Сергей М. © (03.07.07 12:55) [12]
..да нет же не кирилицей есессно -))))) ну написал МойМетод - чтоб не вводить в заблуждение названием реальных методов... как видно - получилось как всегда..
А все-таки - Сергей М. - не подскажите ли как правильно выполнять методы сервера в другом потоке через позднее связываение используя TSocketConnection?
Можно ссылочку на толковые статьи (с примерами желательно)...или книгу какую по-вразумительнее..
Сергей М. (2007-07-03 12:55:00) [33]
> в protected пишу процедурку (она же мой метод)
Прямо кириллицей пишешь ?! И компилятор это спокойно пропускает ?!
Не надо уж лапшу-то вешать)
tytus (2007-07-03 12:40:00) [34]>Сергей М. © (03.07.07 12:10) [9]
интересно - а как вообще люди делают трехзвенку????
Я создал RemoteDataModule.
Затем сохранил прожект, и F9 - и вуаля - сервачег зарегистрировался!
Супер - неправда ли?
Затем добавил форму - File->New->Form... связал модули и.т.п.
Как я добавлял методы сервера? Лехко и проста!
в protected пишу процедурку (она же мой метод) с директивой safecall;
Затем Edit->Add to interface и вписываю сию процедурку.
Сохраняем, запускаем... и о чудо!!! далее думаю ненужно....
>Сергей М. © (03.07.07 12:14) [10]
нет недумал...времени нехватает...
Сергей М. (2007-07-03 12:14:00) [35]
> кроме ухода в сторону от основной темы вопроса
А ты задумался над смыслом, заложенным в название ид-ра EVariantInvalidArgError ?
Сергей М. (2007-07-03 12:10:00) [36]
> что это меняет ?
Это сразу вызывает вопрос - каким образом ты умудрился под Д7 скомпилировать декларацию интерфейса
IMyAppServer = interface(IAppServer)
..
procedure МойМетод;
..
end;
?
tytus (2007-07-03 12:03:00) [37]>Сергей М. © (03.07.07 12:00) [7]
... да хоть китайские иероглифы - что это меняет ? кроме ухода в сторону от основной темы вопроса...
Сергей М. (2007-07-03 12:00:00) [38]
> tytus © (03.07.07 11:50) [6]
У тебя что, метод интерфейса содержит символы кириллицы ?
tytus (2007-07-03 11:50:00) [39]>Anatoly Podgoretsky © (03.07.07 11:45) [5]
а потму позднее, что не подключаю модуль ...TLB сервера, где описаны его методы а просто делаю FConnect.AppServer.МойМетод;
Как же с основным вопросом?
Anatoly Podgoretsky (2007-07-03 11:45:00) [40]> tytus (03.07.2007 11:23:03) [3]
А где здесь позднее связываение?