Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при чтении из буфера обмена, ошибка при чтении из буфера обмена 
:(
    Опции темы
valerchi
Дата 31.8.2014, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Мужики, объясните, что происходит... Имею два потока в одном идёт цикл и счётчик записывается в буфер обмена. В другом потоке идёт считывание из буфера обмена и вывод результата в Memo.
После записи в Мемо нескольких чисел вылетает такая ошибка, что делфи вообще глючит, а буфер обмена не работает.
Вот мой код, первый поток:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls, ClipBrd, Buttons;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Fslu:slu;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
i:=0;
repeat
inc(i);
if Clipboard.AsText <> '' then
begin
Clipboard.Open;
Memo1.SelText := Clipboard.AsText;
Clipboard.Close;
end;
until i=1000;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Fslu := slu.Create(False);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Fslu.Terminate;
   Fslu.Free;
end;

end.

И второй поток
Код

unit Unit2;

interface

uses
  Classes,clipbrd,Messages, SysUtils, Variants, Graphics, Controls, Forms;

type
  slu = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure slu.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ slu }

procedure slu.Execute;
var i:integer; g:string;
begin
i:=0;
repeat
inc(i);
if i=53 then
i:=1;
g:=inttostr(i);
Clipboard.Open;
Clipboard.AsText:=g+' ';
Clipboard.Close;
until i=53;

end;

end.
 

PM MAIL   Вверх
kami
Дата 31.8.2014, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



1. как минимум странно использовать в качестве средства обмена между потоками буфер обмена.
2. Clipboard - синглтон, причем (емнип) не потокобезопасный. Посему - считайте его VCL компонентом, со всеми вытекающими в виде желательной работы через Synchronize. Отсюда могут и глюки расти. А использование Synchronize в контексте приведенного кода полностью сводит на нет все разделение на потоки.
Может, обрисуете задачу? Решение выглядит как из неисправной пушки по воробьям...
PM MAIL WWW   Вверх
valerchi
Дата 31.8.2014, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Раньше я делал почти так же, только вместо записи в буфер обмена, второй поток записывал результат не в буфер, а в файл, а первый поток считывал информацию из файла, (Своего рода генератор случайных чисел) но это было слишком медленно. Хочу поэкспериментировать, сделать гсч таким образом (с помощью буфера обмена).
PM MAIL   Вверх
Poseidon
Дата 1.9.2014, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

Репутация: 9
Всего: 133



Буфер обмена - это территория пользователя. Лезть на эту территорию без разрешения - очень не хорошо. Для синхронизации потоков есть достаточное количество инструментов. Вот тут достаточно хорошо описаны средства синхронизации потоков. Делать это через буфер обмена ой как не правильно. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
drkot
Дата 13.9.2014, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Кроме того, что уже сказано, о плохом тоне такого подхода... могу добавить только причину "глюка".


Первый поток открывает буфер
Второй поток открывает буфер (он уже открыт, по сути ничего не происходит)
Второй поток пишет в буфер
Второй поток закрывает буфер
Первый поток читает из буфера (а он уже закрыт, отсюда и глюк)

Решение: обернуть работу с буфером в критическую секцию, а учитывая что это TObject, то логичнее использовать TMonitor 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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