Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 869

Раздел: Delphi » Прочее
/ вопрос открыт /

Доброго времени суток уважаемые эксперты ! В очередной раз передо мной встала небольшая проблема, на которую ответа в гугле не нашел...
Пишу консольную програмку. Имеется созданный поток. Из программы получить доступ к процедурам потока я знаю как, просто название потока.процедура. А обратно как ? мне надо из потока выполнить функции основной программы... Да даже просто write(text) в окошке программы...
ps Приношу извинения за столь глупый вопрос... Ранее не сталкивался с подобной потребностью...

BloodVIRUS Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: BloodVIRUS (статус: Посетитель)
Вопрос отправлен: 29 декабря 2010, 15:53
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 17; последнее сообщение — 30 декабря 2010, 05:57; участников в обсуждении: 5.
min@y™

min@y™ (статус: Доктор наук), 29 декабря 2010, 16:01 [#1]:

А обратно - Synchronize().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 29 декабря 2010, 16:05 [#2]:

min@y™: Это в консоли то? Шутишь?
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 29 декабря 2010, 16:07 [#3]:

Цитата (DNK):

Это в консоли то?

Не вижу разницы абсолютно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 29 декабря 2010, 16:09 [#4]:

А кто в консольном приложении запускает синхронизированные методы?
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 29 декабря 2010, 16:10 [#5]:

Цитата (BloodVIRUS):

Из программы получить доступ к процедурам потока я знаю как, просто название потока.процедура

И получите проблему с доступом к данным. когда рабочий поток и главный поток будут изменять одну переменную в один момент времени, то получите проблему.
Галочка "подтверждения прочтения" - вселенское зло.
DNK

DNK (статус: Студент), 29 декабря 2010, 16:18 [#6]:

Не видел подобных программ, но предпологаю, что тут могут помочь критические секции и TEvent.
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 29 декабря 2010, 16:41 [#7]:

кое что интересное есть здесь http://digs.alfaspace.net/topics/8
Галочка "подтверждения прочтения" - вселенское зло.
BloodVIRUS

BloodVIRUS (статус: Посетитель), 29 декабря 2010, 16:52 [#8]:

Я наверно не так построил вопрос..
Суть такова. При графическом приложении чтоб из потока получить доступ к программе надо в uses добавить unit1 и из потока можно будет изменять переменные form1.label1.caption.
А в консольном режиме что добавлять в uses потока ?
min@y™

min@y™ (статус: Доктор наук), 29 декабря 2010, 17:00 [#9]:

Надо создать какойнить объект и к нему прицепиться.
Я б щас написал пример, но рабочий комп выключен, я на корпоративе с ноута пишу. Ноут стоит на праздничном столе! Первый раз такое. Это лечится, интересно?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 29 декабря 2010, 17:02 [#10]:

а как Вы собираетесь менять переменную? просто взять и присвоить? без какой-либо синхронизации?

В целом, добавить Вам ничего не можно. потому что приложение пишется в файле проекта. Нужно создать отдельный юнит, куда поместить общие переменные и подключить к проекту и юниту. Но нужна ещё правильная синхронизация.
Галочка "подтверждения прочтения" - вселенское зло.
BloodVIRUS

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

DNK (статус: Студент), 29 декабря 2010, 18:14 [#12]:

Перенеси класс TMyApplication из dpr-файла в отдельный модуль, как советуют умные люди. Кроме того, оно у тебя protected.
"Digital Networked Knight"
BloodVIRUS

BloodVIRUS (статус: Посетитель), 29 декабря 2010, 18:25 [#13]:

Дак блин без проблем могу перенести, но все равно каким то образом мне надо взаимодействовать с консолью ? вот как из этого модуля вывести тест на экран ?
min@y™

min@y™ (статус: Доктор наук), 29 декабря 2010, 18:33 [#14]:

Есть прекрасная статья, не помню названия, но что-то типа "как правильно писать консольные приложения". Погугли, там ОЧЕНЬ много интересного.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
BloodVIRUS

BloodVIRUS (статус: Посетитель), 29 декабря 2010, 19:15 [#15]:

Если не трудно, можете написать только одно. Как из потока вывести сообщение на экран ? перегугли все подряд...
DNK

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

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:29
Выполнено за 0.03 сек.