Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 26.02.2012, 23:50   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток.

Доброго времени суток!

Реализован некий класс который нужно заполнить элементами.
Для того я создал поток, который будет заниматься заполнение класса элементами.

Но мой класс связан с этим потоком(он его запускает).

Вот как это примерно выглядит:


Но я вылетаю в AV при:
Код:
procedure TFListMgr.NewItem(aOnClient, aOnServer, aOnServer_h: string);
var
  fi: TFileInfo;
begin
  fi := TFileInfo.Create;
  fi.fClient := aOnClient;
  fi.fServer := aOnServer;
  fi.fCRC32 := aOnServer_h;
  Add(fi);
end;
...
procedure TFListMgr.Add(aItem: Pointer);
var
  LI: TListItem;
begin
  LI := fLV.Items.Add;  ;<< - EXCEPTION
  LI.Caption := TFileInfo(aItem).fClient;
  LI.SubItems.Add(TFileInfo(aItem).fServer);
  LI.SubItems.Add(TFileInfo(aItem).fCRC32);
  inherited Add(aItem);
end;
Хотя я указываю ListView.

Как быть? Не создавать же в потоке ещё один экземпляр класса. Можно ведь передать в поток указатель на класс и работать с этим класом и всеми его свойсвами.

Последний раз редактировалось Человек_Борща; 27.02.2012 в 00:04.
Человек_Борща вне форума Ответить с цитированием
Старый 27.02.2012, 00:34   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Из потока вызывается NewItem, который в свою очередь Add, откуда изменятся вмизуальный компонент fLV. А синхронизация где?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.02.2012, 01:23   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

Аватар, почему я должен что-то синхронизировать?
Я передаю в поток указатель на класс, и использую его методы.

Если все же надо, то как?

Последний раз редактировалось Человек_Борща; 27.02.2012 в 01:29.
Человек_Борща вне форума Ответить с цитированием
Старый 27.02.2012, 01:46   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Не важно как, но вы из потока методами вашего класса обращаетесь к ListView. И код этих методов работает в потоке. Вот и используйте синхронизацию при обращении к методам этого класса.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.02.2012, 01:48   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

хм возникла мысль, создать свое событие класса с передачей в него record'а с информацией.
Как создать знаю, а вот как со свом параметром, да ещё и положить в этот параметр что-то...

как это сделать? Можно пример?

Последний раз редактировалось Человек_Борща; 27.02.2012 в 01:54.
Человек_Борща вне форума Ответить с цитированием
Старый 27.02.2012, 01:52   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

А чем Synchronize не по душе? Событие класса? Интересно, но уже спать хочется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.02.2012, 02:08   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

1. На диаграмме крайне подозрителен pF: ^TFListMgr;
2. Если fLV - это TListView, то Аватар прав - VCL однопоточна. К её объектам нельзя обращаться из других потоков, даже если это иногда может сходить нам с рук.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 27.02.2012, 02:12   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

класс явл. оберткой над потоком и поток работает только с классом(заполняет), вывод на VCL делает сам класс, есть ситуации когда вывод в vcl вовсе не надо. По этому Thread => VCL не выход.

Я создал метод:
Код:
type
  TrFileInfo=record
    ClientFile:string[255];
    ServerFile:string[255];
    crc32:string[255];
  end;

type
  TOnRecordEvent=procedure(Sender: TObject; aInfo:TrFileInfo) of object;

type
  TWorkThread = class(TThread)
  private
    fScanDir:string;
    fOnRecord:TOnRecordEvent;
...
Using:
            if Assigned(fOnRecord) then
            fOnRecord(Self,fRec);
Возникло 2 вопроса:
1. В реализации TThread OnTerminate вызывается без синхронизации, почему?
Код:
procedure TThread.CallOnTerminate;
begin
  if Assigned(FOnTerminate) then FOnTerminate(Self);
end;
1.1. Если надо,то как передать в метод мой record?

p.s. для мен синхронизация конкретно в данном ПО не ритична т.к. будет всего 1 поток и я выношу в него то, что можен помешать юзеру нормально работать с ПО.

Последний раз редактировалось Человек_Борща; 27.02.2012 в 02:14.
Человек_Борща вне форума Ответить с цитированием
Старый 27.02.2012, 23:24   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

решил дело событиями=)
Человек_Борща вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как удалить объект по указателю на его базовый класс? AndreyBS Общие вопросы C/C++ 5 17.04.2011 11:29
Описать класс-родитель и класс-потомок. Delphi 7 Andrew_M Помощь студентам 0 15.01.2011 15:42
Освободить поток. Нужно удалить 1 событие и 1 класс TwiX Общие вопросы Delphi 3 26.04.2010 02:23
Как создать в Дeлфи класс в DLL для использования его в VC++ Dmitriy.Ch Общие вопросы Delphi 0 25.07.2009 08:40
В среде Delphi составить программу (процесс), который паралельно запускает два потока (нити) metamfetamin Помощь студентам 9 06.11.2007 16:26


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS