Поиск:

Ответ в темуСоздание новой темы Создание опроса
> синхронизация вывода сообщений в TMemo, Подскажите вариант 
:(
    Опции темы
DonPager
  Дата 31.1.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Колдырь
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 28.3.2003
Где: Воронеж

Репутация: 1
Всего: 2



есть класс:
Код

class TLOGER
{
private:    // User declarations
  TMemo* fMemoLog;
  TMemo* fMemoMsg;
  TStringGrid * fsgClients;
  TStringGrid * fsgServers;
  TList *fListC;
  TList *fListS;
public:        // User declarations
  void LogMess(AnsiString msg,int t=Log_Event_Msg);
  void LogPotokMess(AnsiString msg,TThread *AThread);
//  void DrawTbl();
  void DrawUsrTbl(TList *userList=NULL);
  void DrawSrvTbl(TList *userList=NULL);

  void AssignMemoLog(TMemo* destLog){fMemoLog = destLog;};
  void AssignMsgLog(TMemo* destLog){fMemoMsg = destLog;};
  void AssignClientsTbl(TStringGrid* destTbl){fsgClients = destTbl;};
  void AssignServersTbl(TStringGrid* destTbl){fsgServers = destTbl;};

  inline TLOGER(){
    fMemoLog = NULL;
    fMemoMsg = NULL;
    fsgClients = NULL;
    fsgServers = NULL;
    fListC = NULL;
    fListS = NULL;
  }
};
******************
void TLOGER::LogMess(AnsiString msg,int t)
{
  TDateTime datex;
  AnsiString S = DateTimeToStr(datex.CurrentDateTime())+":";

  switch(t){
    case Log_Event_Msg:
      WaitForSingleObject(fMemoLog->Handle,2000);
      fMemoLog->Lines->Add(S+msg);
    break;
    case Log_Error_Msg:
      WaitForSingleObject(fMemoLog->Handle,2000);
      fMemoLog->Lines->Add(S+"!ÎØÈÁÊÀ: "+msg);
    break;
    case Log_Info_Msg :
      WaitForSingleObject(fMemoMsg->Handle,2000);
      fMemoMsg->Lines->Add(S+msg);
    break;
    case Log_Alert_Msg:
      WaitForSingleObject(fMemoLog->Handle,2000);
      fMemoLog->Lines->Add(S+"!ÂÀÆÍΠ: "+msg);
    break;
  };
}

В глобальную переменную этого класса я засылаю месаги из различных потоков 
Код

TLOGER *L;
L->LogMess("Моё сообщение");

и иногда сообщения "накладываются"друг на друга
Так вот подскажите пжалста, может лучше изменить такую схему на PostMessage и отлов сообщений к меме?
Если так то подскажите пример реализации
Спасибо


Это сообщение отредактировал(а) DonPager - 31.1.2008, 11:55


--------------------
кодер + лодырь = колдырь
PM MAIL ICQ Skype GTalk   Вверх
xvr
Дата 31.1.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(DonPager @ 31.1.2008,  11:53)
есть класс:
Код

class TLOGER
{
private:    // User declarations
  TMemo* fMemoLog;
  TMemo* fMemoMsg;
  TStringGrid * fsgClients;
  TStringGrid * fsgServers;
  TList *fListC;
  TList *fListS;
public:        // User declarations
  void LogMess(AnsiString msg,int t=Log_Event_Msg);
  void LogPotokMess(AnsiString msg,TThread *AThread);
//  void DrawTbl();
  void DrawUsrTbl(TList *userList=NULL);
  void DrawSrvTbl(TList *userList=NULL);

  void AssignMemoLog(TMemo* destLog){fMemoLog = destLog;};
  void AssignMsgLog(TMemo* destLog){fMemoMsg = destLog;};
  void AssignClientsTbl(TStringGrid* destTbl){fsgClients = destTbl;};
  void AssignServersTbl(TStringGrid* destTbl){fsgServers = destTbl;};

  inline TLOGER(){
    fMemoLog = NULL;
    fMemoMsg = NULL;
    fsgClients = NULL;
    fsgServers = NULL;
    fListC = NULL;
    fListS = NULL;
  }
};
******************
void TLOGER::LogMess(AnsiString msg,int t)
{
  TDateTime datex;
  AnsiString S = DateTimeToStr(datex.CurrentDateTime())+":";

  switch(t){
    case Log_Event_Msg:
      WaitForSingleObject(fMemoLog->Handle,2000);
      fMemoLog->Lines->Add(S+msg);
    break;
    case Log_Error_Msg:
      WaitForSingleObject(fMemoLog->Handle,2000);
      fMemoLog->Lines->Add(S+"!ÎØÈÁÊÀ: "+msg);
    break;
    case Log_Info_Msg :
      WaitForSingleObject(fMemoMsg->Handle,2000);
      fMemoMsg->Lines->Add(S+msg);
    break;
    case Log_Alert_Msg:
      WaitForSingleObject(fMemoLog->Handle,2000);
      fMemoLog->Lines->Add(S+"!ÂÀÆÍΠ: "+msg);
    break;
  };
}

В глобальную переменную этого класса я засылаю месаги из различных потоков 
Код

TLOGER *L;
L->LogMess("Моё сообщение");

и иногда сообщения "накладываются"друг на друга

VCL объекты расчитанны на работу из главного потока приложения, так что такая реализация черевата не только перекрытием строк, но и полным зависанием  smile 
Цитата

Так вот подскажите пжалста, может лучше изменить такую схему на PostMessage и отлов сообщений к меме?
Можно, но есть способ проще:
Создаешь наследника TThread, который будет принимать сообщения, в нем складываешь принятое сообщение в переменную и через Synchronize вызываешь добавление ее к memo. Это все нужно поместить в критическую секцию, что бы вызовы из разных потоков не перебили переменную.

Кстати, добавлять строку к memo лучше так:
Код

 Log->SelStart=Log->Text.Length();
 Log->SelLength=0;
 Log->SelText=m+"\r\n";

Lines->Add реально вызывает переписывание ВСЕГО memo, что при большом количестве текста весьма весьма заметно  smile 

Это сообщение отредактировал(а) xvr - 31.1.2008, 15:26
PM MAIL   Вверх
dumb
Дата 23.8.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(xvr @  31.1.2008,  16:23 Найти цитируемый пост)
Lines->Add реально вызывает переписывание ВСЕГО memo, что при большом количестве текста весьма весьма заметно
может я что-то не так сделал, но простой цикл, состоящий из 100к итераций и добавляющий в мемо просто номер итерации, с твоим кодом отработал в 4 раза медленней, чем Lines-Add. прокомментируешь?
PM MAIL   Вверх
xvr
Дата 31.8.2008, 22:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(dumb @ 23.8.2008,  14:12)
Цитата(xvr @  31.1.2008,  16:23 Найти цитируемый пост)
Lines->Add реально вызывает переписывание ВСЕГО memo, что при большом количестве текста весьма весьма заметно
может я что-то не так сделал, но простой цикл, состоящий из 100к итераций и добавляющий в мемо просто номер итерации, с твоим кодом отработал в 4 раза медленней, чем Lines-Add. прокомментируешь?

Прокоментирую - это было так в BCB 3.0, в 6ке (надеюсь и далее) сделан нормальный Lines->Add, так что вполне можно использовать его

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.