Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ФТП морозит программу пока работает,надо еще поток 
:(
    Опции темы
Owyn
  Дата 26.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



такая проблема, предлагали либо использовать select либо запустить фтп все в отдельном потоке, без mfc, без .net, xx,  погуглил, посмотрел примеры но так ничего и не вышло )= прошу помощи, вот код моего фтп, 


ftp.h
Код

#ifndef __ftp__
#define __ftp__

#include <io.h>

#define DEFAULT_PORT_NUM 21

#define PASSWORD_LENGTH 256

#define EINTR WSAEINTR 

#define bzero(x,y) memset(x,0,y)

#define bcopy(x,y,z) memcpy(y,x,z)

#define close closesocket

enum {
 LS = 0,
 BINARY,
 ASCII,
 PWD,
 CD,
 OPEN,
 CLOSE,
 QUIT,
 LCD,
 LLS,
 LDIR,
 USER,
 SHELL,
 IGNORE_COMMAND,
 GET,
 PUT,
 HELP,
 RHELP,

 FTP_COMPLETE=1, /* these will be used later */
 FTP_CONTINUE,
 FTP_ERROR
};


class ftp {

public:
    
    ftp();
    ~ftp();

    void DoOpen(char *);
    void DoList(char *);
    void DoCD(char *);
    void DoShellCommand(char *);
    void DoLogin(char *);
    void DoClose(void);
    void DoLCD( char *);
    void DoPut( char *);
    void DoGet( char *);
    void DoLLS(char * );
    void DoBinary();
    void DoRhelp( char *);
    void DoAscii();
    void DoPWD();

    int  CheckFds(char *);

private:
    char szBuffer[1025];  /* buffer used to read/write */
    char szUser[20];          /* stores username */
    char szPass[256];         /* stores user password */
    int Connected;     /* flag for connect status */

    
    int hListenSocket;
    int hControlSocket;
    int hDataSocket;    
    int bSendPort;
    int ReadCommand;
    int bMode;

    int GetReply();
    int GetLine();
    void CleanUp();
    int SendControlMsg(char *, int);
    int SendDataMsg( char *szBuffer, int len);
    int ConnectToServer(char *name, char *port);
    int GetListenSocket();
    int InitWinsock();
    int AcceptConnection();
    void CloseControlConnection( void );
    void CloseDataConnection( int hDataSocket );
    void CloseListenSocket();
    int ReadDataMsg( char *szBuffer, int len);
    void GetPassword( char *szPass );
    int GetUnixInput(char *command);
    int GetWin32Input( char *command);
    void GetFile( char *fname);
    void PutFile( char *fname);
    int ReadControlMsg( char *szBuffer, int len);
    int CheckControlMsg( char *szPtr, int len);
    int CheckInput();

};

#endif


Это сообщение отредактировал(а) Owyn - 26.5.2009, 17:07

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ftp.cpp 27,50 Kb
PM MAIL   Вверх
andrew_121
Дата 26.5.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Чё-то я мэйн не нашел. smile 
Показывай.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Owyn
Дата 26.5.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мэйн:
Код

    theFtpConnection.DoOpen("127.0.0.1");
    theFtpConnection.DoLogin("user:password");

    theFtpConnection.DoCD("cd ftproot");

    theFtpConnection.DoCD("cd files");

    theFtpConnection.DoPut("file.txt"); //закачать file.txt из папки проги в папку files на сервере
    theFtpConnection.DoClose();

PM MAIL   Вверх
andrew_121
Дата 26.5.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Передумал...

Это сообщение отредактировал(а) andrew_121 - 26.5.2009, 19:06


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Owyn
Дата 27.5.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а что передумал? =\
*был бы рад примеру как это сделать, тк у самого не получилось, первый раз общаюсь с multithreading
PM MAIL   Вверх
andrew_121
Дата 27.5.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Owyn, Так я написал. Потом подумал еще разок, понял что не верно.
Идея вот какая.
В твоем объекте, тебе нужно создать поток, в который нужно поместить функции которые работают с сокетами.
Поместить их туда не сложно, но вот как им передавать аргументы, это вопрос. Само простое, это создать структуру которая будет содержать параметры. Объявить на нее глобальный указатель используя volatile. Но в основном потоке тебе придется позаботится о синхронизации.
Кароче не то smile

Добавлено @ 00:55
Я в таких случаях наследуюсь от:

lthread.h
Код

class LCL_EXPORT LThread {
public:
    LThread(lint32 nPriority = THREAD_PRIORITY_NORMAL);
   bool    wait_until_terminate(lulong dwMiliSec = INFINITE);
   bool    start();
   bool    start_and_wait();
   bool    pause();
   bool    is_running();
   bool    is_terminated();
   bool    is_suspend();
   void    set_priority(lint32 nLevel);
   lint32    get_priority();
   void    speed_up();
   void    speed_down();
   void    terminate();
protected:
   virtual void on_init(){}                   //-- Вставлять код инициализации здесь...
   virtual void run() = 0;                    //-- Нужно перегрузить...
   virtual lulong on_exit(){return 0;}     //-- Вставлять завершающий код здесь...
   void exit();
   static unsigned long __stdcall thread_proc(void* lpParameter);
   virtual ~LThread() { ::CloseHandle(_event_handle); }
protected:
   HANDLE   _thread_handle, _event_handle;
   lint32    _init_priority;
   lulong    _thread_id;
   bool     _is_terminated, _is_suspended, _is_running;
};

lthread.cpp
Код

/***************************************************************************/
LThread::LThread( lint32 pri ) {
    _thread_id = 0;
    _thread_handle = NULL;
    _init_priority = pri;
    _is_terminated = _is_suspended = !(_is_running = false);
    _event_handle = ::CreateEvent( NULL, false, false, NULL );
}
/***************************************************************************/
bool LThread::start() {
    if ( _is_terminated ) {
        _thread_handle = (HANDLE)CreateThread( NULL, 0, thread_proc, (void*)this, 0, &_thread_id );
        _is_terminated = _is_suspended = ( _thread_handle == 0 );
        return ( _thread_handle == 0 );
    } else if ( _is_suspended ) {
        if ( ::ResumeThread( _thread_handle ) == 0xFFFFFFFF ) {
            return false;
      }
        _is_suspended = false;
    }
    return true;
}
/***************************************************************************/
bool LThread::start_and_wait() {
    bool res = start();
    if ( res )
        ::WaitForSingleObject( _event_handle, INFINITE );
    return res;
}
/***************************************************************************/
bool LThread::pause() {
    if ( _is_terminated )
        return false;
    if ( _is_suspended )
        return true;
    lulong nRet = ::SuspendThread( _thread_handle );
    if ( nRet == 0xFFFFFFFF )
        return false;
    _is_suspended = true;
    return true;
}
/***************************************************************************/
bool LThread::is_running() {
    return _is_running;
}
/***************************************************************************/
bool LThread::is_terminated() {
    return _is_terminated;
}
/***************************************************************************/
bool LThread::is_suspend() {
    return _is_suspended;
}
/***************************************************************************/
void LThread::terminate() {
    lulong exit_code;
    ::GetExitCodeThread( _thread_handle, &exit_code );
    if ( STILL_ACTIVE == exit_code ) {
        ::TerminateThread( _thread_handle, exit_code );
        ::CloseHandle( _thread_handle );
        _thread_handle = NULL;
    }
    _is_running = false;
    _is_terminated = true;
}
/***************************************************************************/
void LThread::exit() {
    lulong exit_code;
    ::GetExitCodeThread( _thread_handle, &exit_code );
    if ( STILL_ACTIVE == exit_code ) {
        ::ExitProcess( exit_code );
        ::ExitThread( exit_code );
        ::CloseHandle( _thread_handle );
        _thread_handle = NULL;
    }
    _is_running = false;
    _is_terminated = true;
}
/***************************************************************************/
bool LThread::wait_until_terminate( lulong mil ) {
    if ( WaitForSingleObject( _thread_handle, mil ) == WAIT_TIMEOUT )
        return false;
    _is_running = false;
    _is_terminated = true;
    return true;
}
/***************************************************************************/
void LThread::set_priority( lint32 level ) {
    ::SetThreadPriority( _thread_handle, level );
}
/***************************************************************************/
lint32 LThread::get_priority() {
    return ::GetThreadPriority( _thread_handle );
}
/***************************************************************************/
void LThread::speed_up() {
    lint32 old_level, new_level;
    old_level = get_priority();
    if ( THREAD_PRIORITY_TIME_CRITICAL        == old_level)
        return;
    else if ( THREAD_PRIORITY_HIGHEST        == old_level)
        new_level = THREAD_PRIORITY_TIME_CRITICAL;
    else if ( THREAD_PRIORITY_ABOVE_NORMAL    == old_level)
        new_level = THREAD_PRIORITY_HIGHEST;
    else if ( THREAD_PRIORITY_NORMAL            == old_level)
        new_level = THREAD_PRIORITY_ABOVE_NORMAL;
    else if ( THREAD_PRIORITY_BELOW_NORMAL    == old_level)
        new_level = THREAD_PRIORITY_NORMAL;
    else if ( THREAD_PRIORITY_LOWEST            == old_level)
        new_level = THREAD_PRIORITY_BELOW_NORMAL;
    else if ( THREAD_PRIORITY_IDLE            == old_level)
        new_level = THREAD_PRIORITY_LOWEST;
    set_priority( new_level );
} 
/***************************************************************************/
void LThread::speed_down() {
    lint32 old_level, new_level;
    old_level = get_priority();
    if ( THREAD_PRIORITY_TIME_CRITICAL        == old_level)
        new_level = THREAD_PRIORITY_HIGHEST;
    else if ( THREAD_PRIORITY_HIGHEST        == old_level)
        new_level = THREAD_PRIORITY_ABOVE_NORMAL;
    else if ( THREAD_PRIORITY_ABOVE_NORMAL    == old_level)
        new_level = THREAD_PRIORITY_NORMAL;
    else if ( THREAD_PRIORITY_NORMAL            == old_level)
        new_level = THREAD_PRIORITY_BELOW_NORMAL;
    else if ( THREAD_PRIORITY_BELOW_NORMAL    == old_level)
        new_level = THREAD_PRIORITY_LOWEST;
    else if ( THREAD_PRIORITY_LOWEST            == old_level)
        new_level = THREAD_PRIORITY_IDLE;
    else if ( THREAD_PRIORITY_IDLE            == old_level)
        return;
    set_priority( new_level );
}
/***************************************************************************/
unsigned long __stdcall LThread::thread_proc( void* param ) {
    LThread* thread = reinterpret_cast<LThread*>( param );
    thread->set_priority( thread->_init_priority );
    thread->_is_running = true;
    ::SetEvent( thread->_event_handle );
    thread->on_init();
    thread->run();
    return thread->on_exit();
}
/***************************************************************************/

Перегружаю run().

Добавлено через 10 минут и 11 секунд
Да. И типы подправь!

Это сообщение отредактировал(а) andrew_121 - 27.5.2009, 00:56


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Owyn
Дата 27.5.2009, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

В твоем объекте, тебе нужно создать поток, в который поместить в который нужно поместить функции которые работают с сокетами.

 smile 

хотя бы сервер и логин\пароль бы да, неплохо бы передавать функции, хотя не обязательно, можно и без этого, а имена файлов придумываются программой же, т.е. можно просто вшить побольше кода в поток, мне бы сейчас хоть пример как объявнить, создать, засунуть функциии в поток надо, смотрел на гугле и мсдн, но там либо было для MFC, либо совсем неясно как функции засовывать, и еще были примеры которые не компилируются
пс - а разве глобальные переменные нельзя использовать в другом потоке? ну если объявить их рядом с инклюдами, а дать значение уже потом
PM MAIL   Вверх
xvr
Дата 27.5.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тебе нужно ВСЮ работу с ftp засунуть в отдельный поток целиком. Т.е. поток должен стартовать, делать что надо на ftp (БЕЗ общения с основной программой) и завершаться.
Т.е. как то так
Код

int ftp_thread(void*)
{
 ftp theFtpConnection;
 theFtpConnection.DoOpen("127.0.0.1");
 theFtpConnection.DoLogin("user:password");
 theFtpConnection.DoCD("cd ftproot");
 theFtpConnection.DoCD("cd files");
 theFtpConnection.DoPut("file.txt"); //закачать file.txt из папки проги в папку files на сервере
 theFtpConnection.DoClose();
}

main()
{
 ...
 _beginthread(ftp_thread);
 ...
}
Точный прототип для ftp_thread и параметры _beginthread см. в MSDN
Если же нужно взаимодействие ftp потока с остальной программой в процессе жизни этого потока, то нужно продумывать схему их синхронизации, она будет зависить от конкретного использования ftp в программе

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


Новичок



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

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



а как определить функции фтп в потоке? ведь как я понял поток не может просто так взаимодействовать с основным потоком программы, а все функции то внутри него определены, а int ftp_thread(void*) работает как main, просто вызывая их, как определить их локально в этом новом потоке? пс - параметры __begintrhread как раз выдавали мне ошибку компиляции когда я делал по простым примерам =\
PM MAIL   Вверх
azesmcar
Дата 27.5.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Owyn @  27.5.2009,  14:43 Найти цитируемый пост)
а как определить функции фтп в потоке?

никак..поток видет все функции

Цитата(Owyn @  27.5.2009,  14:43 Найти цитируемый пост)
ведь как я понял поток не может просто так взаимодействовать с основным потоком программы

смотря что имеется ввиду. Поток пользуется адресным пространством процесса, все потоки одного процесса могут обращатся к одной переменной. Но тут может понадобится синхронизация.
Цитата(Owyn @  27.5.2009,  14:43 Найти цитируемый пост)
пс - параметры __begintrhread как раз выдавали мне ошибку компиляции когда я делал по простым примерам =\ 

в МСДН полно примеров
PM   Вверх
Owyn
Дата 27.5.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

смотря что имеется ввиду. Поток пользуется адресным пространством процесса, все потоки одного процесса могут обращатся к одной переменной. Но тут может понадобится синхронизация.

есть глобально определенные char и string, их значения должны меняться только по заверщению допольнительного фтп потока, можно ли доп. потоку брать их значения?
PM MAIL   Вверх
azesmcar
Дата 27.5.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Owyn @  27.5.2009,  14:50 Найти цитируемый пост)
есть глобально определенные char и string, их значения должны меняться только по заверщению допольнительного фтп потока, можно ли доп. потоку брать их значения? 

Что можно а чего нельзя зависит от логики программы. Если вам нужно прочитать уже обновленные данные - тогда синхронизируйте..
WaitForSingleObject

PM   Вверх
xvr
Дата 27.5.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Owyn @ 27.5.2009,  14:50)
Цитата

смотря что имеется ввиду. Поток пользуется адресным пространством процесса, все потоки одного процесса могут обращатся к одной переменной. Но тут может понадобится синхронизация.

есть глобально определенные char и string, их значения должны меняться только по заверщению допольнительного фтп потока, можно ли доп. потоку брать их значения?

Да

PM MAIL   Вверх
Owyn
Дата 27.5.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



о, как в мсдн конечно не заработало, но посмотрев на ошибку вспомнил что такая уже была, просто дописал __cdecl  и заработало) спс всем
PM MAIL   Вверх
azesmcar
Дата 27.5.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Owyn

Цитата

Start address of a routine that begins execution of a new thread. For _beginthread, the calling convention is either __cdecl or __clrcall; for _beginthreadex, it is either __stdcall or __clrcall.

МСДН и читать тоже надо smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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