Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вопрос про поток. [D7, XP]


Страницы:   1 2 3

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;


В доп.потоке это недопустимо.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо