|
Вопрос # 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
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|