Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Thread и Memo


Автор: Matematik 18.9.2006, 10:29
Потокобезопасна функция memo.Lines.Add() ?
Я демках инди она быполняется без синхронизации. 
Я посмотрел, там в коде работает тьлько SendMessage.
 smile  smile 

Автор: Alexeis 18.9.2006, 10:48
А как же это
Код

function TStrings.Add(const S: string): Integer;
begin
  Result := GetCount;
  Insert(Result, S);
end;

Если оба будут добавлять строку, чему будет равно значение 
Result := GetCount; ?? - это будет зависить от момента когда прервали выполнение.

Автор: Romikgy 18.9.2006, 10:50
Цитата(Matematik @  18.9.2006,  09:29 Найти цитируемый пост)
Я посмотрел, там в коде работает тьлько SendMessage.

покажи этот код 

Автор: Matematik 18.9.2006, 10:57
Цитата(alexeis1 @ 18.9.2006,  11:48)
А как же это
Код

function TStrings.Add(const S: string): Integer;
begin
  Result := GetCount;
  Insert(Result, S);
end;

Если оба будут добавлять строку, чему будет равно значение 
Result := GetCount; ?? - это будет зависить от момента когда прервали выполнение.

Понял. Спасибо.

Автор: Alexeis 18.9.2006, 10:59
Цитата(Romikgy @  18.9.2006,  10:50 Найти цитируемый пост)

покажи этот код  

Код

procedure TMemoStrings.Insert(Index: Integer; const S: string);
var
  SelStart, LineLen: Integer;
  Line: string;
begin
  if Index >= 0 then
  begin
    SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0);
    if SelStart >= 0 then Line := S + #13#10 else
    begin
      SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index - 1, 0);
      if SelStart < 0 then Exit;
      LineLen := SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0);
      if LineLen = 0 then Exit;
      Inc(SelStart, LineLen);
      Line := #13#10 + s;
    end;
    SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelStart);
    SendMessage(Memo.Handle, EM_REPLACESEL, 0, Longint(PChar(Line)));
  end;
end;


Автор: Romikgy 18.9.2006, 11:08
alexeis1, 
Код

function TMemoStrings.GetCount: Integer;
begin
  Result := 0;
  if Memo.HandleAllocated or (Memo.WindowText <> nil) then
  begin
    Result := SendMessage(Memo.Handle, EM_GETLINECOUNT, 0, 0);
    if SendMessage(Memo.Handle, EM_LINELENGTH, SendMessage(Memo.Handle,
      EM_LINEINDEX, Result - 1, 0), 0) = 0 then Dec(Result);
  end;
end;

 smile  smile 

Автор: Alexeis 18.9.2006, 11:13
Romikgy, при таком количестве операций и обращений к данным я даже боюсь предположить каков будет результат...

Автор: Romikgy 18.9.2006, 11:19
Цитата(alexeis1 @  18.9.2006,  10:13 Найти цитируемый пост)
при таком количестве операций и обращений к данным я даже боюсь предположить каков будет результат...

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

Автор: Alexeis 18.9.2006, 11:24
Цитата(Romikgy @  18.9.2006,  11:19 Найти цитируемый пост)
 А юзал синхронизацию smile 

Тем более, что наверняка будут еще какие обращения к полям данных. Кроме трудноуловимых ошибок больше ничего добится нельзя

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)