Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поток и визуальные компоненты формы, Типа завис :) 
V
    Опции темы
WapCel
Дата 12.8.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 3.11.2008
Где: Moldova

Репутация: нет
Всего: нет



Привет!

Код

//---------------------------------------------------------------------------
[...]

#include <process.h>

#include "Unit1.h"
#include "fs.h"  // My functions
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "dxfProgressBar"
#pragma resource "*.dfm"
TForm1 *Form1;


SECURITY_ATTRIBUTES  sa = {
    sizeof(SECURITY_ATTRIBUTES), /* structure size */
    0,      /* No security descriptor */
    TRUE    /* Thread handle is inheritable */
};
unsigned threadId;
HANDLE hThread;
bool thrend=true;

void TForm1::mEmailSender(TObject *Sender)
{
Form1->Notebook1->ActivePage="Sending";

// Setare Socket
SOCKET    e_socket; // variabila socket
e_socket = Connect("myserever.myhost.xxx", 80); // Conectare la Server

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

AnsiString PostData, Query;

// Folmularea cererii
PostData = "er23Q="+Form1->Edit1->Text; // To
PostData += "&lf3dfr3Z="+Form1->Edit2->Text; // From
PostData += "&k42sgfgsmS="+Form1->Edit3->Text; // Subject
PostData += "&qq12z3vWe="+Form1->Memo1->Text; //Message

// Prioritatea mesajului
if (Form1->RadioGroup1->ItemIndex==0) { PostData+="&411xsi=5"; }
else if (Form1->RadioGroup1->ItemIndex==1) { PostData+="&411xsi=3"; }
else if (Form1->RadioGroup1->ItemIndex==2) { PostData+="&411xsi=1"; }

// Tipul mesajului
if (Form1->RadioGroup2->ItemIndex==0) { PostData+="&ty4e=Plain"; }
else if (Form1->RadioGroup2->ItemIndex==1) { PostData+="&ty4e=HTML"; }
else if (Form1->RadioGroup2->ItemIndex==2) { PostData+="&ty4e=Pattern"; }

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

Query = "POST /send.om?software&v=1.0.1.1 HTTP/1.1\r\n";
Query += "Host: web.sendmail.wapcel.org\r\n";
Query += "User-Agent: Mozilla/5.0 (By Osoian Marcel)\r\n";
Query += "Content-type: application/x-www-form-urlencoded\r\n";
Query += "Content-Length: "+ IntToStr(PostData.Length()) +"\r\n";
Query += "Cookie: SessionID=a6Xy6grrLRp4\r\n";
Query += "Connection: Close\r\n";
Query += "\r\n";
Query += PostData;

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

// Expedierea cererii
send (e_socket, Query.c_str(), strlen(Query.c_str()), 0);

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

// Receptionarea textului de la server
AnsiString RecievText, Text;

 int size=1024; // 1Kb 
 char *result=(char*)malloc(size);
 char *res=(char*)malloc(size*1024);
 strcpy(result,"");
 int bytesrec=1;
 while (bytesrec!=0)
 {
  bytesrec=recv(e_socket,result,sizeof(size),0);
  result[bytesrec]=0;
  strcat(res, result);
 }
 //strcpy(res,strstr(res,"\r\n\r\n")+4);
 RecievText=res; // to AnsiString
 // Eliberam memoria ocupata
 delete[] res;
 delete[] result;

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

// Eliminarea Header-urilor
Text = RecievText.SubString(RecievText.Pos("\r\n\r\n")+4, RecievText.Length());
// Text = RecievText.Delete(0, RecievText.Pos("\r\n\r\n"));

switch (StrToInt(Text))
{
   case 0:  Form1->Notebook1->ActivePage="Sent"; break; // Mesajul a fost expediat cu succes!
   case 1: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Mesajul Dvs. nu a fost expediat din cauza unei erori de server!"; break;
   case 2: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Puteti expedia 25 de mesaje timp de 24 de ore!"; break;
   case 10: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti destinatarul;"; break;
   case 11: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Adresa e-mail \""+ Form1->Edit1->Text.Trim() +"\" nu este recunoscuta. Corectati-o si incercati din nou;"; break;
   case 12: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (50) in cimpul \"Catre\";"; break;
   case 20: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti expedietorul;"; break;
   case 21: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Adresa e-mail \""+ Form1->Edit2->Text.Trim() +"\" nu este recunoscuta. Corectati-o si incercati din nou;"; break;
   case 22: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (50) in cimpul \"De la\";"; break;
   case 30: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti subiectul;"; break;
   case 32: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (200) in cimpul \"Subiect\";"; break;
   case 40: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti mesajul;"; break;
   case 42: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (10000) in cimpul \"Mesaj\";"; break;
   default: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Raspunsul serverului nu este cunoscut!"; break;
}
//shutdown (e_socket, 0);
closesocket(e_socket);

thrend=true;
}

// Procesul de expediere
static unsigned __stdcall tfunc(void *arg)
{
void mEmailSender(TObject *Sender);
return 0;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
// Check if Mutex already exists
HANDLE hMutex;
hMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, "E-mail_Sender_v1101");
if(hMutex)
{
Notebook1->ActivePage="already_exists";
}
else
{
// It must not exist, so make Mutex
hMutex = CreateMutex(NULL, FALSE, "E-mail_Sender_v1101");

// Conexiunea Internet
if (!GetStatusConnect()) { Notebook1->ActivePage="Error"; Label10->Caption="Conexiunea cu serverul nu poate fi efectuata.\r\nVa rog conectativa la Internet."; }
}
}
//---------------------------------------------------------------------------


void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
// Click pe butonul Trimite
// Conexiunea Internet

// Conexiunea Internet
if (!GetStatusConnect()) { Notebook1->ActivePage="Error"; Label10->Caption="Conexiunea cu serverul nu poate fi efectuata.\r\nVa rog conectativa la Internet."; }
else
{
if (thrend==true)
{
// Crerea unui proces aparte (Create thread)
hThread = (HANDLE)_beginthreadex(
         0,          /* Thread security */
         0,         /* Thread stack size (4096) */
         tfunc,   /* Thread starting address */
         (void *)0,    /* Thread start argument */
         CREATE_SUSPENDED,  /* Create in suspended state */
         &threadId);   /* Thread ID */

//SetThreadPriority(hThread, THREAD_PRIORITY_LOWEST);
ResumeThread(hThread);
}
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
// Form Close
CloseHandle(hThread);
}
//---------------------------------------------------------------------------



Елементы формы не получают команды из потока...
Как исправить?..

Добавлено через 2 минуты и 39 секунд
если можно без:
Код

Application->ProcessMessages(); // :)


Добавлено через 10 минут и 38 секунд
Код

static unsigned __stdcall tfunc(void *arg)
{
Form1->Notebook1->ActivePage="Sending";
Application->ProcessMessages();

// Setare Socket
SOCKET    e_socket; // variabila socket
e_socket = Connect("web.sendmail.wapcel.org", 80); // Conectare la Server

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

AnsiString PostData, Query;

// Folmularea cererii
PostData = "dShf="+Form1->Edit1->Text; // To
PostData += "&lfr3="+Form1->Edit2->Text; // From
PostData += "&k2sm="+Form1->Edit3->Text; // Subject
PostData += "&1zve="+Form1->Memo1->Text; //Message

// Prioritatea mesajului
if (Form1->RadioGroup1->ItemIndex==0) { PostData+="&4xsi=5"; }
else if (Form1->RadioGroup1->ItemIndex==1) { PostData+="&4xsi=3"; }
else if (Form1->RadioGroup1->ItemIndex==2) { PostData+="&4xsi=1"; }

// Tipul mesajului
if (Form1->RadioGroup2->ItemIndex==0) { PostData+="&type=Plain"; }
else if (Form1->RadioGroup2->ItemIndex==1) { PostData+="&type=HTML"; }
else if (Form1->RadioGroup2->ItemIndex==2) { PostData+="&type=Pattern"; }

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

Query = "POST /send.om?software&v=1.0.1.1 HTTP/1.1\r\n";
Query += "Host: web.sendmail.wapcel.org\r\n";
Query += "User-Agent: Mozilla/5.0 (By Osoian Marcel)\r\n";
Query += "Content-type: application/x-www-form-urlencoded\r\n";
Query += "Content-Length: "+ IntToStr(PostData.Length()) +"\r\n";
Query += "Cookie: SessionID=a6Xy6grrLRp4\r\n";
Query += "Connection: Close\r\n";
Query += "\r\n";
Query += PostData;

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

// Expedierea cererii
send (e_socket, Query.c_str(), strlen(Query.c_str()), 0);

Form1->dxfProgressBar1->Position++;  // +1 position
Sleep(100);

// Receptionarea textului de la server
AnsiString RecievText, Text;

 int size=1024; // 1Kb 
 char *result=(char*)malloc(size);
 char *res=(char*)malloc(size*1024);
 strcpy(result,"");
 int bytesrec=1;
 while (bytesrec!=0)
 {
  bytesrec=recv(e_socket,result,sizeof(size),0);
  result[bytesrec]=0;
  strcat(res, result);
 }
 //strcpy(res,strstr(res,"\r\n\r\n")+4);
 RecievText=res; // to AnsiString
 // Eliberam memoria ocupata
 delete[] res;
 delete[] result;

Form1->dxfProgressBar1->Position++;  // +1 position
Application->ProcessMessages();
Sleep(100);

// Eliminarea Header-urilor
Text = RecievText.SubString(RecievText.Pos("\r\n\r\n")+4, RecievText.Length());
// Text = RecievText.Delete(0, RecievText.Pos("\r\n\r\n"));

switch (StrToInt(Text))
{
   case 0:  Form1->Notebook1->ActivePage="Sent"; break; // Mesajul a fost expediat cu succes!
   case 1: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Mesajul Dvs. nu a fost expediat din cauza unei erori de server!"; break;
   case 2: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Puteti expedia 25 de mesaje timp de 24 de ore!"; break;
   case 10: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti destinatarul;"; break;
   case 11: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Adresa e-mail \""+ Form1->Edit1->Text.Trim() +"\" nu este recunoscuta. Corectati-o si incercati din nou;"; break;
   case 12: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (50) in cimpul \"Catre\";"; break;
   case 20: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti expedietorul;"; break;
   case 21: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Adresa e-mail \""+ Form1->Edit2->Text.Trim() +"\" nu este recunoscuta. Corectati-o si incercati din nou;"; break;
   case 22: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (50) in cimpul \"De la\";"; break;
   case 30: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti subiectul;"; break;
   case 32: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (200) in cimpul \"Subiect\";"; break;
   case 40: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Introduceti mesajul;"; break;
   case 42: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Ati depasit numarul maxim de caractere (10000) in cimpul \"Mesaj\";"; break;
   default: Form1->Notebook1->ActivePage="Error"; Form1->Label10->Caption="Raspunsul serverului nu este cunoscut!"; break;
}
//shutdown (e_socket, 0);
closesocket(e_socket);

thrend=true;
return 0;
}

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
// Click pe butonul Trimite
// Conexiunea Internet

// Conexiunea Internet
if (!GetStatusConnect()) { Notebook1->ActivePage="Error"; Label10->Caption="Conexiunea cu serverul nu poate fi efectuata.\r\nVa rog conectativa la Internet."; }
else
{
if (thrend==true)
{
// Crerea unui proces aparte (Create thread)
hThread = (HANDLE)_beginthreadex(
         0,          /* Thread security */
         0,         /* Thread stack size (4096) */
         tfunc,   /* Thread starting address */
         (void *)0,    /* Thread start argument */
         CREATE_SUSPENDED,  /* Create in suspended state */
         &threadId);   /* Thread ID */

//SetThreadPriority(hThread, THREAD_PRIORITY_LOWEST);
ResumeThread(hThread);
}
}
}

PM MAIL WWW ICQ   Вверх
WapCel
Дата 12.8.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 3.11.2008
Где: Moldova

Репутация: нет
Всего: нет



View attachment

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  E_mail_Sender.rar 355,90 Kb
PM MAIL WWW ICQ   Вверх
Alca
Дата 12.8.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

Елементы формы не получают команды из потока...
Как исправить?..

::PostMessage или ::SendMessage из потока 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 12.8.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



http://forum.vingrad.ru/forum/topic-267117...и/view-all.html

Добавлено через 2 минуты и 22 секунды
еще
http://forum.vingrad.ru/topic-60076.html


--------------------
PM WWW ICQ Skype Jabber   Вверх
WapCel
Дата 12.8.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 3.11.2008
Где: Moldova

Репутация: нет
Всего: нет



Праблема в NoteBook1 (Form1->Notebook1->ActivePage="Error";)
При использов. этого компнента Поток зависает...

ИММЕНО ЭТОТ КОМОНЕНТ!

Это сообщение отредактировал(а) WapCel - 12.8.2009, 21:02
PM MAIL WWW ICQ   Вверх
Alca
Дата 12.8.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

 char *result=(char*)malloc(size);
 char *res=(char*)malloc(size*1024);
...
 delete[] res;
 delete[] result;

 smile 

Код

Application->ProcessMessages();

Это лишнее

Добавлено @ 21:28
Эсли уже зацепил Билдер, то юзай TThread.
------------------------------------------------
Модеры! Нафиг этот "пунтосвич"?

Добавлено @ 21:30
Цитата

bytesrec=recv(e_socket,result,sizeof(size),0);

Может:
Код

bytesrec=recv(e_socket,result, /*sizeof(*/size/*)*/,0);


Это сообщение отредактировал(а) Alca - 12.8.2009, 21:31


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 13.8.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(WapCel @ 12.8.2009,  20:03)
Праблема в NoteBook1 (Form1->Notebook1->ActivePage="Error";)
При использов. этого компнента Поток зависает...

ИММЕНО ЭТОТ КОМОНЕНТ!

Проблема в VCL - нельзя ее компоненты (визуальные) звать из потока, только из main.
Используй TThread, у него для этого есть специальный метод - Synchronize

PM MAIL   Вверх
WapCel
  Дата 14.8.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 3.11.2008
Где: Moldova

Репутация: нет
Всего: нет



OK.
Thanks.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.