узнать, включен ли определенный компьютер в сеть

Тема в разделе "Delphi - Сети", создана пользователем ronik, 24 окт 2006.

Статус темы:
Закрыта.
  1. ronik

    ronik Гость

    pls... подскажите пожалуйста..
    как узнать, подключен ли определенный компьютер к сети... :(
    найти все имена и сравнить с тем что имеется не подходит,
    это слишком громоздко и долго, нужны другие способы...
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Проверить IP

    если нет сети то комп имеет адрес 127,0,0,1
     
  3. ronik

    ronik Гость

    это вариант конечно, но мне надо проверить доступен ли другой компьютер в сети...
    хотя, я уже написал по глупому... получил весь список компов в сети и сравнил...
    не знаю, вроде быстро работает пока... как на других машинах будет? посмотрим..
    спасибо за совет...
    это тоже можно использовать для проверки... так и сделаем... спасибо...
     
  4. zubr

    zubr Гость

    Попробовать подключится к удаленной машине с помощью функции WNetAddConnection2.
     
  5. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    ping, а то вдруг удаленный компьютер не под виндой))))
     
  6. ronik

    ronik Гость

    попробывать то можно, но дело в том, что если сеть резко оборветься, то программа подвиснет на некоторое время, а этот вопрос то и надо решить.... :D

    компьютер под виндой.... ну а можно сделать быстрый ping из под Delphi?
    если да, то как?
     
  7. ronik

    ronik Гость

    и еще: почему не работает вот этот код? :
    Код (Text):
    if GetSystemMetrics(SM_NETWORK) and $01 = $01 then
    ShowMessage(′Сеть есть!′)
    else
    ShowMessage(′Сети нет!′);
    даже если сети нет то выдаётся что "Сеть есть"... :D
    не понятно...
    можно как-нибудь так же быстро но правильно определить есть ли сеть?
     
  8. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    http://www.google.com/search?hl=ru&q=D...&lr=lang_ru :p

    Пинг быстрым быть не может по определению, в любом случае нужно ждать ответа на пинг, но в случае с локальной сетью таймаут можно брвть маленьким. Но пинг это правильное стандартное платформонезависимое решение :D
     
  9. ronik

    ronik Гость

    с этим я асболютно согласен :p ... но программа не может пинговать каждые 3 секунды например...
    она просто будет висеть... суть в том сделать так, чтобы после пропадания коннекта с сервером,
    по любой причине, после вызова процедур проверки папки по сети типа DirectoryExists(), программа не подвисала на некоторое время, а то на некоторых машинах и вообще навсегда :D ...
     
  10. ronik

    ronik Гость

    вот... такая идея пришла... как проверить время выполнения функции, например DirectoryExists() в deplhi?
    и если она выпоняется более, допустим, 1 секунды, просто дать заключение о невозможности соединения и прервать выпонение функции... чтоб программа дальше работала... есть такая возможность в delphi?
     
  11. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    В твоей постановке никак

    Как вариант, запускаешь функцию в отдельной потоке и ждешь его(потока) завершения с таймаутом
     
  12. ronik

    ronik Гость

    хм... надо попробывать...спасибо...
    он то у меня и есть потоком только... как ждать завершения?
    еще один таймер? не сильно ли громоздко?
     
  13. ronik

    ronik Гость

    дамс... теперь новый вопрос: как остановить выполнение потока, если он выполняется более чем 1 секунда? :(
     
  14. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    BOOL TerminateThread(
    HANDLE hThread,
    DWORD dwExitCode
    );

    DWORD WaitForSingleObject(
    HANDLE hHandle,
    DWORD dwMilliseconds
    );
     
  15. ronik

    ronik Гость

    спасибо...
    я всё правильно понимаю:
    создаю процесс... потом жду, если нет, то убиваю...
    Код (Text):
     goP:=TThread.Create(true);
    goP.Priority:=tpLowest;
    goP.FreeOnTerminate:=TRUE;
    goP.Resume;
    if WaitForSingleObject(goP.Handle,1000)=WAIT_TIMEOUT then
    begin
    gop.Terminate;
    end;
    или вот так:
    Код (Text):
     goP:=TThread.Create(true);
    goP.Priority:=tpLowest;
    goP.FreeOnTerminate:=TRUE;
    goP.Resume;
    if WaitForSingleObject(goP.Handle,1000)=Wait_Object_0 then
    else
    gop.Terminate;
    в двух приведенных случаях не работает... может быть проблема в том, что
    поток создаётся на основе класса TThread а не функцие CreateThread()?
    и если ждат в основной программе, то она подвисает по моему на время таймаута....
    может WaitForSingleObject() должен быть в теле потока? если да, то где именно? и
    в каким образом?
     
  16. Shurik Ilyin

    Shurik Ilyin Гость

    Оба случая некорректны: если у потока TThread выставлен флаг FreeOnTerminated := True, то после Resume нельзя обращаться к объекту потока, т.к. его теоретически уже может и не быть.

    Т.к. внутри потока реализовано примерно так:
    Код (Text):
    procedure TGop.Execute;
    begin
    while not Terminated do begin
    // здесь длительная обработка
    end;
    end;
    то вызов gop.Terminate не остановит работу потока, пока тот не закончит обработку.
    Пробуй использовать TerminateThread, только внимательно изучи документацию - там описаны ряд нюансов.
     
  17. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    вряд ли, TThread всего лишь wrapper, хотя в делфи я не специалист

    Ну можно и так сказать. Давай ты лучше раскажешь чтто именно тебе надо реализовать
     
  18. ronik

    ronik Гость

    мне нужно проверить, доступна ли папка на каком-либо удаленном компьютере, но так, чтобы приложение не подвисало в момент проверки... просто проверка идет, а вот если резко выключить сеть из компьютера, то приложение подвисает на некоторое время (обычно не менее 5 секунд)... так то всё работает, но когда уходит сеть, то всё... надо ждать :) ... подвисают функции проверки...
     
  19. ronik

    ronik Гость

    спасибо... понятно...
    уже пробывал... эффект тот же... только памяти приложение больше ест... )
     
  20. Shurik Ilyin

    Shurik Ilyin Гость

    Код (Text):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ExtCtrls;

    type

    TMyThread = class(TThread)
    protected
    procedure Execute; override;
    end;

    TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure MyThreadTerminate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    private
    FMyThread: TMyThread;
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if not Assigned(FMyThread) then begin
    FMyThread := TMyThread.Create(True);
    FMyThread.OnTerminate := MyThreadTerminate;
    FMyThread.Resume;
    end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    if Assigned(FMyThread) then begin
    TerminateThread(FMyThread.Handle, 0);
    FreeAndNil(FMyThread);
    end;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    FreeAndNil(FMyThread);
    end;

    procedure TForm1.MyThreadTerminate(Sender: TObject);
    begin
    MessageDlg('MyThread finished', mtInformation, [mbYes], 0);
    Timer1.Enabled := True;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    Timer1.Enabled := False;
    FreeAndNil(FMyThread);
    end;

    { TMyThread }

    procedure TMyThread.Execute;
    begin
    Sleep(10000); // долгая операция
    end;

    end.
    Вот этот код работает примерно как тебе надо. Замени Sleep на проверку компьютера в сети и протестируй.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей