Форум — Ответы     (  К темам )
 ?  Alex: stack overflow :( Помогите, 2ю неделю мучаюсь (15-04-2003 02:00:58)
Запускаю таймер. В нем передаю переменные компонентам и нажимаю кнопки.
Каждая кнопка запускает отдельный идентичный компонент, в програме каждой кнопки создаю new TMemoryString и удаляю его в конце, устанавливаю переменную на повторный запуск из таймера.
Через 660 ровно! запусков кнопок выдает ошибку stack overflow. Причем без разницы нажимает ли таймер 10 или 50 кнопок.
 Павел (15-04-2003 09:59:35)
Код.
 Георгий (15-04-2003 10:01:14)
Хорошо, что не на 666 запуске...
Покажи код.
 Alex (15-04-2003 23:26:49)
В onTimer
{
типа
if (final==0){Timer1->Enabled=false;goto fin;}
if (knop1==true){final--;knop1=false; Button1Click(Sender);ansi1="текст1";goto fin;}
if (knop2==true){final--;knop2=false; Button1Click(Sender);ansi2="текст2";goto fin;}
if (knop3==true){final--;knop3=false; Button1Click(Sender);ansi3="текст3";goto fin;}
fin:
}

В бутонах
{
TMemoryStream *DataOut =new TMemoryStream();
Buf = ansi1;
DataOut->Write(&Buf[1], Buf.Length());
DataOut->Seek(0, soFromBeginning);
..................
Запуск компонента с параметрами;
..................
delete DataOut;knop1=true;
}
 Alex (15-04-2003 23:28:48)
Перепутал маленько
В onTimer
{
типа
if (final==0){Timer1->Enabled=false;goto fin;}
if (knop1==true){final--;knop1=false;ansi1="текст1"; Button1Click(Sender);goto fin;}
if (knop2==true){final--;knop2=false;ansi1="текст2"; Button1Click(Sender);goto fin;}
if (knop3==true){final--;knop3=false;ansi1="текст3"; Button1Click(Sender);;goto fin;} ^^^^^^^^^^^^^^
fin:
}

В бутонах
{
TMemoryStream *DataOut =new TMemoryStream();
Buf = ansi1;
DataOut->Write(&Buf[1], Buf.Length());
DataOut->Seek(0, soFromBeginning);
..................
Запуск компонента с параметрами;
..................
delete DataOut;knop1=true;
}
 Георгий (17-04-2003 22:38:43)
Всй конечно замечательно, но где описание переменной Buf ?
А без неё у меня всё это работает...
 Alex (17-04-2003 23:25:47)
AnsiString Buf;
 Petro (18-04-2003 10:22:53)
Найди строку, в которой происходит переполнение стека. Ошибка там.
 Георгий (18-04-2003 11:50:45)
static int final=10000;
static bool knop1,knop2,knop3;
static AnsiString ansi1,Buf;

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (final==0){Timer1->Enabled=false;goto fin;}
if (knop1==true){final--;knop1=false;ansi1="òåêñò1"; Button1Click(Sender);goto fin;}
if (knop2==true){final--;knop2=false;ansi1="òåêñò2"; Button1Click(Sender);goto fin;}
if (knop3==true){final--;knop3=false;ansi1="òåêñò3"; Button1Click(Sender);goto fin;}
fin:
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMemoryStream *DataOut =new TMemoryStream();
Buf = ansi1;
this->Button1->Caption=final;
if (Buf.Length())
{
DataOut->Write(&Buf[1], Buf.Length());
DataOut->Seek(0, soFromBeginning);
};
delete DataOut;
knop1=true;
}

ну нету вылетов и со стеком всё в порядке