Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1222762898
neon-w
2008-09-30 12:21
2008.11.09
NAN????


15-1221252916
RaMoNeZz
2008-09-13 00:55
2008.11.09
Помогите упростить код и проверить правильно ли написан он....


2-1222669916
vegarulez
2008-09-29 10:31
2008.11.09
вопрос про поток.


3-1209208049
hahol_64_rus
2008-04-26 15:07
2008.11.09
не могу создать тригер


2-1222781286
Alexei
2008-09-30 17:28
2008.11.09
Действие пользователя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский