Форум: "Начинающим";
Текущий архив: 2008.11.09;
Скачать: [xml.tar.bz2];
Внизвопрос про поток. Найти похожие ветки
← →
vegarulez © (2008-09-29 10:31) [0]не могу понять...
при нажатии 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 10:37) [1]
> выдаёт ошибку при Connected:=true; к БД
И текст этой ошибки, наверно, вот такой -"Выдаю ошибку !"
Я угадал ?
> Form1.Memo1.Text:=Mylist.Text;
В доп.потоке это недопустимо.
← →
Ega23 © (2008-09-29 10:38) [2]Зачем поток? Зачем создавать и убивать коннект каждый раз?
← →
vegarulez © (2008-09-29 10:48) [3]
> Сергей М. © (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]
ну потому как нужно к базе конектится и отрываться потом от неё, чтобы на ней не было конектов. Так надо.
← →
Сергей М. © (2008-09-29 10:53) [4]
> vegarulez © (29.09.08 10:48) [3]
>
>
Если AV возник именно на строчке
With myzconection do
try
..
Connected:=true //<- этой
то это говорит об одном: переменная myzconection равна nil.
← →
vegarulez © (2008-09-29 10:57) [5]Да именно на ней.
но почему после нажатия на батон2 - поток начинает фунцикулировать нормально...
Или я что-то не понимаю или одно из двух... я ничего не могу понять... в чём может быть трабла?
← →
sniknik © (2008-09-29 11:08) [6]> Зачем поток?
не нужен, и даже асинхронное выполнение под вопросом... лучше оптимизировать обработку данных в плане скорости, чем "прятать" ее длительное выполнение в другом потоке.
> Зачем создавать и убивать коннект каждый раз?
велосипед.
> в юзес он прописан. делать так можно - но не желательно.
всего лишь нежелательно? бред. это суицид для потока.
> ну потому как нужно к базе конектится и отрываться потом от неё, чтобы на ней не было конектов. Так надо.
TADOConnection.KeepConnection = false
и все, автоматический "отконект" при не активности (все рекордсеты закрыты), и автоматический же переконект при активности.
понятно, что у тебя другие, видимо "навороченные" компоненты, но судя по тому что используется
> Protocol:="ado";
и исходя из того что "навороченное" должно поддерживать весь функционал того что замещает... должно быть.
← →
sniknik © (2008-09-29 11:12) [7]> то это говорит об одном: переменная myzconection равна nil.
а может еще о том, что что-то используемое в myzconection равно nil... например парент, по аналогии с клиентским датасетом, которому тоже необходим парент для нормальной работы.
можно положить тот же код вне потока, с привязкой к форме, и проверить.
← →
vegarulez © (2008-09-29 11:16) [8]использую Access - он по ADO работает.
С чего это вдруг суицид для него? выплюнуть текст в мемо? В чём суицид?
Данных для обработки - мало. В чём суицид?
> TADOConnection.KeepConnection = false
использую Zeos компоненты так что это мимо.
ближе к телу вопроса плиз, если есть что сказать по сути.
← →
Vlad Oshin © (2008-09-29 11:17) [9]а если так написать?
CoInitializeEx (NIL, COINIT_APARTMENTTHREADED);
COINIT_MULTITHREADED
перед
TADOConnection.Create(nil)
← →
vegarulez © (2008-09-29 11:17) [10]
> можно положить тот же код вне потока, с привязкой к форме,
> и проверить.
Я же сказал по буттон2 он лежит. Ты читать умеешь?
← →
Vlad Oshin © (2008-09-29 11:18) [11]
> TZConnection.Create(nil);
всмысле,
ну, раз "ado"
← →
vegarulez © (2008-09-29 11:18) [12]
> TADOConnection.Create(nil)
Да неиспользую я ADO... Zeos юзаю!!!
народ повнимательнее плз....
← →
Сергей М. © (2008-09-29 11:21) [13]
> Да именно на ней
Как ты это узнал - методом научного тыка или при пошаговой трассировке ?
> выплюнуть текст в мемо?
А назем его туда "плевать" ? Только лишь для отладки или есть тайный резон ?
Если для отладки и при этом ты в курсе про требования по синхронизации с осн.потоком, то почему игнорируешь эти требования ?
← →
Сергей М. © (2008-09-29 11:22) [14]
> именно на ней
Или IDE сама тебе пальцем ткула именно в эту строчку ?
← →
vegarulez © (2008-09-29 11:23) [15]
> Только лишь для отладки
да. поэтому игнорирую.
При пошагавой по F8.
← →
vegarulez © (2008-09-29 11:28) [16]2 Сергей
проверь, что всё пашет после нажатия буттона2 даже без синхронизации. почему только после запуска приложения и нажатия первым буттон1 - он сругнётся - нажмёшь на 2-ой и всё кул.... первый начнёт работать... Вот что меня вводит в откровенный ступор.
← →
sniknik © (2008-09-29 11:34) [17]> В чём суицид?
vcl не потокобезопасен, обмен между потоками напрямую не допустим, и т.д.
второй мой пост, фактически про тоже самое в отношении зеос-а, возможно и он тоже сделан "чисто vcl-ным".
> использую Zeos компоненты так что это мимо.
это я понял сразу, потому и написал про аналог. логика блин. в ado есть, зеос использует ado, но круче него (иначе смысл?), а раз так то должен поддерживать такую малость (а вообще весь функционал + чтото дополнительное, свое).
← →
Сергей М. © (2008-09-29 11:35) [18]Т.е. ты ставишь брейкпойнт
procedure Tmsgsend.Execute;
var
..
myzconection: TZConnection;
..
begin
..
myzconection:= TZConnection.Create(nil);
..
With myzconection do
..
Connected:=true; // <-- сюда
ловишь его, делаешь шаг и тут же, на этом шагу, имеешь AV с упомянутым адресом 004DBE9 ? И при этом IDE указывает именно на эту же (а не на какую-либо иную) строчку ?
И если брейкпойн поставитьWith myzconection // <-- здесь
то отладчик показывает заведомо корректный (не nil) адрес объекта класса TZConnection ?
← →
Сергей М. © (2008-09-29 11:37) [19]
> всё пашет после нажатия буттона2
На начхать на твой "буттон2" !
Я пытаюсь выяснить логику твоего мышления при отладке треда, а не при танцах с бубном вокруг буттонов ..
← →
Vlad Oshin © (2008-09-29 11:41) [20]я может не в свое лезу, но CoInitializeEx пробовали? Не получилось?
Может буттон1 не инициализирует COM library что надо для ADO, и что бывает если создавать динамически компаненты. А буттон2 инициализирует, после чего и буттон1 начинает работать.
← →
sniknik © (2008-09-29 11:41) [21]> Вот что меня вводит в откровенный ступор.
вот так работает?procedure TForm1.Button1Click(Sender: TObject);
var
myzconection: TZConnection;
begin
myzconection:= TZConnection.Create(nil);
Application.ProcessMessages
Thread_SendMail:=Tmsgsend.Create(False);
Thread_SendMail.priority:=tpNormal;
myzconection.Free;
end;
если да, то если Free; сразу после создания. (проверить, нужна инициализация или внутренний обьект)
> Да неиспользую я ADO... Zeos юзаю!!!
> народ повнимательнее плз....
зато зеос его использует, а ado нужен coinitialize() на каждый поток.
← →
vegarulez © (2008-09-29 11:43) [22]Сергей М. © (29.09.08 11:37) [19]
пробегаю по потоку F8 брек поинт стоит в самом начале. После того как прохожу Connected:=true; - Велетаю на except. Вот вся логика.
← →
sniknik © (2008-09-29 11:47) [23]MessageDlg тоже vcl-ная функция, со всеми последствиями.
← →
Сергей М. © (2008-09-29 11:50) [24]
> Вот вся логика
Ну что тут сказать ? Логика дилетанта)
Перед шагом следовало проверить, что myzconectionкак минимум <> nil
← →
sniknik © (2008-09-29 11:51) [25]
> 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;
зачем тебе менять Memo1.Text столько раз сколько записей? здесь тормозов столько что...
поток не нужен.
← →
Сергей М. © (2008-09-29 11:54) [26]
> После того как прохожу Connected:=true; - Велетаю на except
При этом ты должен был получить текст сообщения об исключении, начинающийся со слова "Error".
В [3] это слово не фигурирует, что наводит на мысль, что исключение вызвано вовсе не этой строчкой.
Что говорит IDE об адресе 004DBE9 ?
← →
vegarulez © (2008-09-29 11:55) [27]
> sniknik © (29.09.08 11:47) [23]
Да при чём тут это то?
> sniknik © (29.09.08 11:41) [21]procedure TForm1.Button1Click(Sender: TObject);
var
myzconection: TZConnection;
begin
myzconection:= TZConnection.Create(nil);
With myzconection do
try
Database:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\tu.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False";
Protocol:="ado";
Loginprompt:=false;
Connected:=true;
finally
myzconection.Disconnect;
myzconection.Free;
end;
Thread_SendMail:=Tmsgsend.Create(False);
Thread_SendMail.priority:=tpNormal;
end;
ну канеш так работает. тоже самое и содержится в буттоне2. Я их специально разнёс в разные баттоны - чтобы показать разницу.
Почему сразу не раблотает!!!! Вот в чём вопрос? Почему нужно сначало из главного потока сделать конексед=тру, иначе дочерний не может почему-то. Вот в чём вопрос. не нужно рассказов про vcl. На этот вопрос кто-нибудь может ответить?
← →
Сергей М. © (2008-09-29 11:57) [28]
> sniknik © (29.09.08 11:51) [25]
Все просто - автор пытается пользовать отладчик, но при этом ему не доверяет и дублирует отладочную информацию кривыми "плевками" в Мемо)
← →
vegarulez © (2008-09-29 11:57) [29]Сергей М. © (29.09.08 11:54) [26]
Ну я же не совсем валенок ))) Ну есть там это слово - оно создано рукотворно - я его опустил просто чтоб не заморачивать вас лишним словом. Есть канешно Error - далее перенос каретки - как и полагается. Всё как я и написал в программе.
← →
Сергей М. © (2008-09-29 11:59) [30]
> vegarulez © (29.09.08 11:57) [29]
Ответы на [24], [26] будут ?
← →
vegarulez © (2008-09-29 12:00) [31]Сергей М. © (29.09.08 11:57) [28]
мл.....
вы что издеваетесь что ле??????
Я про одно вы про другое... да при чём тут мемо и т.п. ....
главный вопрос кратко:
ПОЧЕМУ:
приprocedure TForm1.Button1Click(Sender: TObject);
var
myzconection: TZConnection;
begin
myzconection:= TZConnection.Create(nil);
With myzconection do
try
Database:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\tu.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False";
Protocol:="ado";
Loginprompt:=false;
Connected:=true;
finally
myzconection.Disconnect;
myzconection.Free;
end;
Thread_SendMail:=Tmsgsend.Create(False);
Thread_SendMail.priority:=tpNormal;
end;
Не РАВНОprocedure TForm1.Button1Click(Sender: TObject);
begin
Thread_SendMail:=Tmsgsend.Create(False);
Thread_SendMail.priority:=tpNormal;
end;
← →
brother © (2008-09-29 12:02) [32]строк больше? ты почему упорно не хочешь ответить, что тебя спросили? партизан?
← →
vegarulez © (2008-09-29 12:03) [33]brother © (29.09.08 12:02) [32]
на что??? Ну всё что он в ошибке выдаёт - я написал. ну на что ответить то ещё?????
← →
brother © (2008-09-29 12:04) [34]ты что курил?
← →
vegarulez © (2008-09-29 12:06) [35]brother © (29.09.08 12:04) [34]
ну реально не смешно. не в тему.
← →
vegarulez © (2008-09-29 12:06) [36]brother © (29.09.08 12:04) [34]
ну реально не смешно. не в тему.
← →
Vlad Oshin © (2008-09-29 12:07) [37]
> CoInitializeEx пробовали? Не получилось?
← →
vegarulez © (2008-09-29 12:09) [38]почему в дочернем потоке не может осуществить конект пока в главном потоке не произведёшь конект?.... кто нить может кратко ответить, не говоря мне про мемо vcl и прочее? если по существу какую инфу надо - отвечу на вопросы. Но вроде уже и так всё расписал дословно каждое действие. и какие ошибки и как отладчик их отловил - и что выдал...
← →
vegarulez © (2008-09-29 12:11) [39]Vlad Oshin © (29.09.08 12:07) [37]
не знаю как этим пользоваться.
← →
Сергей М. © (2008-09-29 12:11) [40]
> при чём тут мемо и т.п.
мемо тут действительно ни причем, а вот "и т.п." оч даже причем.
Ну не желаешь отвечать - парься тогда сам)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.11.09;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.008 c