![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос про поток. [D7, XP]
vegarulez © (2008-09-29 10:31:00)не могу понять...
при нажатии button1, на котором висит запуск потока - не работает.
выдаёт ошибку при Connected:=true; к БД...
если же нажать button2, а потом button1 - всё работает... ничего не понимаю... подскажите где собака порылась?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SendMail, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
Thread_SendMail:Tmsgsend;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Thread_SendMail:=Tmsgsend.Create(False);
Thread_SendMail.priority:=tpNormal;
end;
// далее копия потока, вызываемого по батону1 забиндинная на батон2... для проверки.
procedure TForm1.Button2Click(Sender: TObject);
var
s:string;
i,j:integer;
smsg: array[0..4] of string;
myzconection: TZConnection;
myzquery: TZQuery;
myList:TstringList;
begin
//FormMain.sendmail:=1;
myList:=TStringList.Create;
j:=0;
myzconection:= TZConnection.Create(nil);
myzquery:= TZQuery.Create(nil);
With myzconection do
try
Database:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False';
Protocol:='ado';
Loginprompt:=false;
try
Connected:=true;
except
on E: Exception do
MessageDlg('Error' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
end;
With myzquery do
try
Connection:=myzconection;
Sql.Text:='Select `id`,`c_date`,`check_id`,`oper_num`,`c_sum` from `payment` where `sflag`=0 and `flag`=0 ORDER BY id ASC';
open;
While not Eof do
begin
for j:=0 to FieldCount-1 do
smsg[j]:=Fields[j].AsString;
myList.Append(FormatDateTime('DD.MM.YYYY',myzquery.Fields[1].Asdatetime)+#9+FormatDateTime('hh:nn:ss',myzquery.Fields[1].Asdatetime)+#9+myzquery.Fields[2].AsString+#9+myzquery.Fields[3].AsString+#9+StringReplace(myzquery.Fields[4].AsString, ',', '.', [rfReplaceAll])+#13);
Form1.Memo1.Text:=Mylist.Text;
Next;
end;
except on E: Exception do
Begin
MessageDlg('Error #3' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
End
end;
finally
myList.Free;
myzconection.Disconnect;
myzquery.Free;
myzconection.Free;
end;
end;
end.
далее код потока
unit SendMail;
interface
uses
Classes, SysUtils, QDialogs, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection;
type
Tmsgsend = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
uses unit1;
procedure Tmsgsend.Execute;
var
s:string;
i,j:integer;
smsg: array[0..4] of string;
myzconection: TZConnection;
myzquery: TZQuery;
myList:TstringList;
begin
//FormMain.sendmail:=1;
try
myList:=TStringList.Create;
j:=0;
myzconection:= TZConnection.Create(nil);
myzquery:= TZQuery.Create(nil);
With myzconection do
try
Database:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False';
Protocol:='ado';
Loginprompt:=false;
Connected:=true;
except on E: Exception do
MessageDlg('Error' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
end;
With myzquery do
try
Connection:=myzconection;
Sql.Text:='Select `id`,`c_date`,`check_id`,`oper_num`,`c_sum` from `payment` where `sflag`=0 and `flag`=0 ORDER BY id ASC';
open;
While not Eof do
begin
for j:=0 to FieldCount-1 do
smsg[j]:=Fields[j].AsString;
myList.Append(FormatDateTime('DD.MM.YYYY',myzquery.Fields[1].Asdatetime)+#9+FormatDateTime('hh:nn:ss',myzquery.Fields[1].Asdatetime)+#9+myzquery.Fields[2].AsString+#9+myzquery.Fields[3].AsString+#9+StringReplace(myzquery.Fields[4].AsString, ',', '.', [rfReplaceAll])+#13);
Form1.Memo1.Text:=Mylist.Text;
Next;
end;
except on E: Exception do
Begin
MessageDlg('Error #3' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
End
end;
finally
myList.Free;
myzconection.Disconnect;
myzquery.Free;
myzconection.Free;
end;
end;
end.
Сергей М. (2008-09-29 11:22:00) [41]
> именно на ней
Или IDE сама тебе пальцем ткула именно в эту строчку ?
Сергей М. (2008-09-29 11:21:00) [42]
> Да именно на ней
Как ты это узнал - методом научного тыка или при пошаговой трассировке ?
> выплюнуть текст в мемо?
А назем его туда "плевать" ? Только лишь для отладки или есть тайный резон ?
Если для отладки и при этом ты в курсе про требования по синхронизации с осн.потоком, то почему игнорируешь эти требования ?
vegarulez (2008-09-29 11:18:00) [43]
> TADOConnection.Create(nil)
Да неиспользую я ADO... Zeos юзаю!!!
народ повнимательнее плз....
Vlad Oshin (2008-09-29 11:18:00) [44]
> TZConnection.Create(nil);
всмысле,
ну, раз "ado"
vegarulez (2008-09-29 11:17:00) [45]
> можно положить тот же код вне потока, с привязкой к форме,
> и проверить.
Я же сказал по буттон2 он лежит. Ты читать умеешь?
Vlad Oshin (2008-09-29 11:17:00) [46]а если так написать?
CoInitializeEx (NIL, COINIT_APARTMENTTHREADED);
COINIT_MULTITHREADED
перед
TADOConnection.Create(nil)
vegarulez (2008-09-29 11:16:00) [47]использую Access - он по ADO работает.
С чего это вдруг суицид для него? выплюнуть текст в мемо? В чём суицид?
Данных для обработки - мало. В чём суицид?
> TADOConnection.KeepConnection = false
использую Zeos компоненты так что это мимо.
ближе к телу вопроса плиз, если есть что сказать по сути.
sniknik (2008-09-29 11:12:00) [48]> то это говорит об одном: переменная myzconection равна nil.
а может еще о том, что что-то используемое в myzconection равно nil... например парент, по аналогии с клиентским датасетом, которому тоже необходим парент для нормальной работы.
можно положить тот же код вне потока, с привязкой к форме, и проверить.
sniknik (2008-09-29 11:08:00) [49]> Зачем поток?
не нужен, и даже асинхронное выполнение под вопросом... лучше оптимизировать обработку данных в плане скорости, чем "прятать" ее длительное выполнение в другом потоке.
> Зачем создавать и убивать коннект каждый раз?
велосипед.
> в юзес он прописан. делать так можно - но не желательно.
всего лишь нежелательно? бред. это суицид для потока.
> ну потому как нужно к базе конектится и отрываться потом от неё, чтобы на ней не было конектов. Так надо.
TADOConnection.KeepConnection = false
и все, автоматический "отконект" при не активности (все рекордсеты закрыты), и автоматический же переконект при активности.
понятно, что у тебя другие, видимо "навороченные" компоненты, но судя по тому что используется
> Protocol:='ado';
и исходя из того что "навороченное" должно поддерживать весь функционал того что замещает... должно быть.
vegarulez (2008-09-29 10:57:00) [50]Да именно на ней.
но почему после нажатия на батон2 - поток начинает фунцикулировать нормально...
Или я что-то не понимаю или одно из двух... я ничего не могу понять... в чём может быть трабла?
Сергей М. (2008-09-29 10:53:00) [51]
> vegarulez © (29.09.08 10:48) [3]
>
>
Если AV возник именно на строчке
With myzconection do
try
..
Connected:=true //<- этой
то это говорит об одном: переменная myzconection равна nil.
vegarulez (2008-09-29 10:48:00) [52]
> Сергей М. © (29.09.08 10:37) [1]
Access violation at address 004DBE9 in module `Project1.exe`.Read of address 00000000
> > Form1.Memo1.Text:=Mylist.Text;
в юзес он прописан. делать так можно - но не желательно.
З.Ы. про Синхронизацию знаю.
> Ega23 © (29.09.08 10:38) [2]
ну потому как нужно к базе конектится и отрываться потом от неё, чтобы на ней не было конектов. Так надо.
Ega23 (2008-09-29 10:38:00) [53]Зачем поток? Зачем создавать и убивать коннект каждый раз?
Сергей М. (2008-09-29 10:37:00) [54]
> выдаёт ошибку при Connected:=true; к БД
И текст этой ошибки, наверно, вот такой -"Выдаю ошибку !"
Я угадал ?
> Form1.Memo1.Text:=Mylist.Text;
В доп.потоке это недопустимо.