| Понятие программирование, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Как остановить приложение?, Хелп Горячие клавишы Время в tstatusbar ListView Повторный запуск уже работающей программы, Как заблокировать повторный запуск Как защитить исходники? Помогите с потоком!, (ошибка синхронизации?) Как корректно измерить длину и размер, динамического массива? Свернуть в Tray чужую прогу, Блин как сделать подскажите плиз Ассоциация файла с прогой Шифрование... Чтение файла с Handle Функции очистки массива использование памяти несколько о TMemo, TMemo memo поиск текст увеличить объем Рег. выражения?, есть ли такое Преобразовать integer в array of byte Как Вы относитесь к курящим девушкам? Ошибка ввода-вывода Запрет запуска дубля программы, Без THandle Как у меньшить размер приложения? TListView and Drag&Drop Поверх других, окна, прогри, поверх, под использование памяти Как в Excel скопировать формат ячеек? Новый тип файла, новое расширение файла Как сделать жадать нажатия клавиши, В Паскале Readkey, в модуле CRT, а тут? Как отловить изменение раскладки клавиатуры RasAPI вот она!, Дозвон до провайдера Удалить содержимое файла, как ? Работа с TListView Передача (пароль,логин) при Dial-Up? FTP клиент стандартными компонентами Delphi Запустить другую прогу скрытой Как в Task manager'e убить процесс? Помогите найти таблицу кодов ANSI Lookup в обычном Grid'e, Почему-то не работает Люди подскажите ссылку........, А то у нас в городе не найдешь ......... RichEdit, Форматирование текста Запись в файл - помогите, а то скоро уже клаву молотком убью Программирование портов в Windows XP RichEdit, Программный скроллинг Ярмарка вакансий Samsung Electronics, Работа и обученией с компанией Не правилная форма WinApi для работы с Delphi7 Где можно взять компоненты для Delphi? Как убрать программу из списка задач в WindowXP? Описание kernel32.dll Windows XP Построение графика, по оси X - текущее время TLabel c прозрачным фоном... Может кто подскажет? Работа с COM-портом, Подскажите... Программирование портов в Windows XP Работа с COM-портом, Подскажите... О самом выдающемся dbGrid сбрасывает выделеные строки IdHTTP или IdFTP UPLOAD, Пожалуйтса скореее помогите DBGrid и еговозможности, DBGrid и еговозможности Делаю подсветку синтаксиса html но где-то бага!! Код на Паскале, Как будет на дельфи AES128 Обработка событий, для динамически генерируемых компонент SQL запрос..., Помогите. Как Вы относитесь к курящим девушкам? Функция Windows.WriteFile, Вопрос... COM-порт + Модем Midi forms and Com Port Время показа hint., Обычный хинт в обычной форме... Хук не получается сделать... дата установки виндов |
Платные хостинги Раскрутка сайта Книги по программированию Помогите с потоком!, (ошибка синхронизации?)
- Я заношу из базы данных в TListView данные, и подгружаю к итемсам картинки. Сначала я всё делал в основном потоке, и ошибок не взникало, но было подтомраживание, неудобсва, поэтому я решил вынести часть кода, который загружает картинки, в отдельный поток. Тут и полезла одна ,но очень странная ошибка: EOutOfResources with message 'The reauested resource is in use'. Если во время загрузки ничего не делать с TListView , то вроде всё нормально, но если его скроллишь, или ещё что-нибудь делаешь (толком я не понял), то иногда возникает эта ошибка... Судя по тексту ошибка может тут поток юзает что-то, пока это занято основным потоком? Но что?Привожу мини-приложение, где возникает ошибка (есть только это, ничего не вырезал на всякий случай)Код unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, StdCtrls, ComCtrls, ExtCtrls, ImgList;type TForm1 = class(TForm) DataSource1: TDataSource; Query1: TQuery; Image1: TImage; ListView1: TListView; Edit1: TEdit; Button1: TButton; Button2: TButton; ImageList1: TImageList; procedure Button1Click(Sender: TObject);procedure additem_(sender: TObject; Name_ : String; tag : integer ); private { Private declarations } public { Public declarations } end;var Form1: TForm1; thum_images_:integer; const dbname = 'D:\DolphinImages.DB';implementationuses Searchthread;{$R *.dfm}procedure tform1.additem_(sender: TObject; Name_ : String; tag : integer );var new:tlistitem;beginnew := ListView1.Items.Add;new.Indent:=tag;new.Caption:=Name_;end;procedure TForm1.Button1Click(Sender: TObject);var sqltext,sqlquery:string; i:integer;beginListView1.Clear;ImageList1.Clear;sqltext:=edit1.text;sqlquery:='SELECT * FROM "'+dbname+'"';sqlquery:=sqlquery+' WHERE FileName like '''+sqltext+'''';Query1.sql.text:=sqlquery;Query1.active:=true;Query1.First;for i:=1 to Query1.RecordCount dobeginadditem_(sender, Query1.FieldByName('Name').asstring, Query1.FieldByName('ID').asinteger );Query1.Next; end; Search_thread.Create(false);end;end.highlightSyntax('delphijBhODY','delphi');и сам поток:Код unit Searchthread;interfaceuses Dialogs, Classes,DBGrids,DB, DBTables, SysUtils,ComCtrls, Graphics, jpeg;type Search_thread = class(TThread) fitem: TListItem; findex:integer; fbit:Tbitmap; fpic:tpicture; fQuery: TQuery; fDataSource: TDataSource; private procedure setimageindex; procedure addimagetolist; { Private declarations } protected procedure Execute; override; end;implementation{ Search_thread }uses Unit1;procedure Search_thread.setimageindex;begin fitem.ImageIndex:=findex;end;procedure Search_thread.addimagetolist;begintryform1.ImageList1.Add(fbit,nil);excepton E: Exception do begin Search_thread.Create(true); showmessage(E.Message); end;end;end;procedure Search_thread.Execute; var fbs:TBlobStream; i:integer;begin fQuery:=TQuery.Create(nil); fDataSource:=TDataSource.Create(nil); fDataSource.DataSet:=fQuery; fQuery.DatabaseName:='DolphinAlias'; fbit:=Tbitmap.create; fbit.PixelFormat:=pf24bit; fbit.Width:=100; fbit.Height:=100; fbit.Canvas.Brush.color:=clwhite; fbit.Canvas.pen.color:=clwhite; fpic:=tpicture.create; fpic.Graphic:=TJPEGImage.Create; fbit.canvas.rectangle(0,0,100,100); fbit.canvas.Draw(50 - form1.image1.picture.Graphic.Width div 2,50 - form1.image1.picture.Graphic.height div 2,form1.image1.picture.Graphic); //картинка по умолчанию, пока не загрузилось то, что надо Synchronize(addimagetolist); thum_images_:=0; with form1 do begin for i:=1 to listview1.Items.Count do if listview1.Items[i-1].ImageIndex=0 then begin try fQuery.Active:=false; fQuery.sql.text:='SELECT * FROM "'+dbname+'"'+' WHERE ID='''+inttostr(listview1.Items[i-1].Indent)+''''; fQuery.active:=true; except Showmessage('Point 1') end; try fbs:=TBlobStream.Create(TBlobField(fQuery.FieldByName('thum')),bmRead); if fbs.Size<>0 then fpic.Graphic.loadfromStream(fbs); fbs.Free; except Showmessage('Point 2') end; tryfbit.canvas.rectangle(0,0,100,100);fbit.canvas.Draw(50 - fpic.Graphic.Width div 2,50 - fpic.Graphic.height div 2,fpic.Graphic);inc(thum_images_);fitem:=listview1.Items[i-1];findex:= thum_images_; except Showmessage('Point 3') end; trySynchronize(addimagetolist);Synchronize(setimageindex); except Showmessage('Point 4') end; end; end; fbit.free; fpic.Free; fQuery.Free; fDataSource.Free;end;end.highlightSyntax('delphiI1NTU5Y','delphi');ошибка вылетает в addimagetolist, но компилятор её не отлавливает толком, только изза секции try можно мпонять, что ошибка возниикает именно там. Я вроде бы выполнил Synchronize, но что-то тут ещё... Люди, помогите!!! - Эх, никто не в курсе... Пришлось разбираться самому. Для тех, кому интересно, что же тут было: всё исправилось изменением процедур в нити:Код procedure Search_thread.setimageindex;beginfitem.ImageIndex:=thum_images_;SendMessage(form2.listview1.handle, LVM_SETIMAGELIST, LVSIL_NORMAL, Longint(form2.imagelist1.handle));end;highlightSyntax('delphijVmN2Y','delphi');иКод procedure Search_thread.addimagetolist;var fmask, fim:tbitmap;beginfmask:=tbitmap.create;fim:=tbitmap.create;fim.Assign(fbit);ImageList_Add(form2.imagelist1.Handle,fbit.Handle, fmask.Handle);fim.Free;fmask.Free;end;highlightSyntax('delphijc1MTU1','delphi');Но интересно, как же классифицировать ошибку... Прошлый глюк бы по-моему из-за следующего: при изменении в имэйджлист, как то добавлении лементов), перерисовывалось одновременно содержимое листвьюва, причём это присходило с помощью внутренней процедуры имэйджвьюва change, которая было объявлена как динамическая... По-моему метод синхронизе не очень точно работал с этим динамическим метедом и иногда из-за этого и происходила ошибка. при использовании ImageList_Add имэйджлист не вызывает метод change, и ошибка пропадает... |