| 
| 
 | Вопрос # 4 869/ вопрос открыт / | 
 |  Доброго времени суток уважаемые эксперты ! В очередной раз передо мной встала небольшая проблема, на которую ответа в гугле не нашел...Пишу консольную програмку. Имеется созданный поток. Из программы получить доступ к процедурам потока я знаю как, просто название потока.процедура. А обратно как ? мне надо из потока выполнить функции основной программы... Да даже просто write(text) в окошке программы...
 ps Приношу извинения за столь глупый вопрос... Ранее не сталкивался с подобной потребностью...
 
|  |   Вопрос задал: BloodVIRUS (статус: Посетитель)Вопрос отправлен: 29 декабря 2010, 15:53
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 17; последнее сообщение — 30 декабря 2010, 05:57; участников в обсуждении: 5. 
|   | min@y™ (статус: Доктор наук), 29 декабря 2010, 16:01 [#1]:А обратно - Synchronize(). Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DNK (статус: Студент), 29 декабря 2010, 16:05 [#2]:min@y™: Это в консоли то? Шутишь? "Digital Networked Knight" |  
|   | min@y™ (статус: Доктор наук), 29 декабря 2010, 16:07 [#3]: Цитата (DNK): Это в консоли то?  Не вижу разницы абсолютно.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DNK (статус: Студент), 29 декабря 2010, 16:09 [#4]:А кто в консольном приложении запускает синхронизированные методы? "Digital Networked Knight" |  
|   | Вадим К (статус: Академик), 29 декабря 2010, 16:10 [#5]: Цитата (BloodVIRUS): Из программы получить доступ к процедурам потока я знаю как, просто название потока.процедура И получите проблему с доступом к данным. когда рабочий поток и главный поток будут изменять одну переменную в один момент времени, то получите проблему.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | DNK (статус: Студент), 29 декабря 2010, 16:18 [#6]:Не видел подобных программ, но предпологаю, что тут могут помочь критические секции и TEvent. "Digital Networked Knight" |  
|   | BloodVIRUS (статус: Посетитель), 29 декабря 2010, 16:52 [#8]:Я наверно не так построил вопрос.. Суть такова. При графическом приложении чтоб из потока получить доступ к программе надо в uses добавить unit1 и из потока можно будет изменять переменные form1.label1.caption.
 А в консольном режиме что добавлять в uses потока ?
 |  
|   | min@y™ (статус: Доктор наук), 29 декабря 2010, 17:00 [#9]:Надо создать какойнить объект и к нему прицепиться. Я б щас написал пример, но рабочий комп выключен, я на корпоративе с ноута пишу. Ноут стоит на праздничном столе! Первый раз такое. Это лечится, интересно?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 29 декабря 2010, 17:02 [#10]:а как Вы собираетесь менять переменную? просто взять и присвоить? без какой-либо синхронизации? 
 В целом, добавить Вам ничего не можно. потому что приложение пишется в файле проекта. Нужно создать отдельный юнит, куда поместить общие переменные и подключить к проекту и юниту. Но нужна ещё правильная синхронизация.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | BloodVIRUS (статус: Посетитель), 29 декабря 2010, 17:50 [#11]:min@y™ Ты это имел ввиду ? если да то как получить доступ к записи status ? program hlr;
 
 {$mode objfpc}{$H+}
 
 uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Classes, SysUtils, CustApp, Unit1
 { you can add units after this };
 
 type
 
 { TMyApplication }
 
 TMyApplication = class(TCustomApplication)
 protected
 status : string;
 procedure DoRun; override;
 public
 constructor Create(TheOwner: TComponent); override;
 destructor Destroy; override;
 end;
 
 { TMyApplication }
 
 procedure TMyApplication.DoRun;
 var
 ErrorMsg: String;
 begin
 
 { add your program here }
 
 // stop program loop
 Terminate;
 end;
 
 constructor TMyApplication.Create(TheOwner: TComponent);
 begin
 inherited Create(TheOwner);
 StopOnException:=True;
 end;
 
 destructor TMyApplication.Destroy;
 begin
 inherited Destroy;
 end;
 
 var
 Application: TMyApplication;
 
 {$R *.res}
 
 begin
 Application:=TMyApplication.Create(nil);
 Application.Title:='hlr';
 Application.Run;
 Application.Free;
 end.
 |  
|   | DNK (статус: Студент), 29 декабря 2010, 18:14 [#12]:Перенеси класс TMyApplication из dpr-файла в отдельный модуль, как советуют умные люди. Кроме того, оно у тебя protected. "Digital Networked Knight" |  
|   | BloodVIRUS (статус: Посетитель), 29 декабря 2010, 18:25 [#13]:Дак блин без проблем могу перенести, но все равно каким то образом мне надо взаимодействовать с консолью ? вот как из этого модуля вывести тест на экран ? |  
|   | min@y™ (статус: Доктор наук), 29 декабря 2010, 18:33 [#14]:Есть прекрасная статья, не помню названия, но что-то типа "как правильно писать консольные приложения". Погугли, там ОЧЕНЬ много интересного. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BloodVIRUS (статус: Посетитель), 29 декабря 2010, 19:15 [#15]:Если не трудно, можете написать только одно. Как из потока вывести сообщение на экран ? перегугли все подряд... |  
|   | DNK (статус: Студент), 29 декабря 2010, 22:44 [#16]:BloodVIRUS: Поток вывода вроде бы один. Так что выводить по идее можно откуда угодно. "Digital Networked Knight" |  
|   | КМ (статус: Посетитель), 30 декабря 2010, 05:57 [#17]:я как то дела так используя TThread создать в потоке переменную например:
 
 OnWriteText:procedure(text_:string);
 
 в консольной проге создать процедуру:
 
 procedure DoWriteText(text_:string);
 begin
 Write(text_);
 end;
 
 далее, после того как будет создан поток:
 
 MyThread.OnWriteText:= DoWriteText;
 
 для синхронизации можно добавить обработку критической секции в DoWriteText
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |