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

  • Автор темы ronik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

ronik

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

morpheus

скриптописец
07.08.2006
3 915
1
#2
Проверить IP

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

ronik

#3
Проверить IP
если нет сети то комп имеет адрес 127,0,0,1
это вариант конечно, но мне надо проверить доступен ли другой компьютер в сети...
хотя, я уже написал по глупому... получил весь список компов в сети и сравнил...
не знаю, вроде быстро работает пока... как на других машинах будет? посмотрим..
спасибо за совет...
это тоже можно использовать для проверки... так и сделаем... спасибо...
 
Z

zubr

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

Kmet

Java Team
25.05.2006
1 036
8
#5
ping, а то вдруг удаленный компьютер не под виндой))))
 
R

ronik

#6
Попробовать подключится к удаленной машине с помощью функции WNetAddConnection2
попробывать то можно, но дело в том, что если сеть резко оборветься, то программа подвиснет на некоторое время, а этот вопрос то и надо решить.... :D

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

ronik

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

Kmet

Java Team
25.05.2006
1 036
8
#8
http://www.google.com/search?hl=ru&q=D...&lr=lang_ru :p

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

ronik

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

ronik

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

Kmet

Java Team
25.05.2006
1 036
8
#11
В твоей постановке никак

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

ronik

#12
Как вариант, запускаешь функцию в отдельной потоке и ждешь его(потока) завершения с таймаутом
хм... надо попробывать...спасибо...
он то у меня и есть потоком только... как ждать завершения?
еще один таймер? не сильно ли громоздко?
 
R

ronik

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

Kmet

Java Team
25.05.2006
1 036
8
#14
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);

DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
 
R

ronik

#15
спасибо...
я всё правильно понимаю:
создаю процесс... потом жду, если нет, то убиваю...
Код:
 goP:=TThread.Create(true);
goP.Priority:=tpLowest;
goP.FreeOnTerminate:=TRUE;
goP.Resume;
if WaitForSingleObject(goP.Handle,1000)=WAIT_TIMEOUT then
begin
gop.Terminate;
end;
или вот так:
Код:
 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() должен быть в теле потока? если да, то где именно? и
в каким образом?
 
S

Shurik Ilyin

#16
Код:
 goP:=TThread.Create(true);
goP.Priority:=tpLowest;
goP.FreeOnTerminate:=TRUE;
goP.Resume;
if WaitForSingleObject(goP.Handle,1000)=WAIT_TIMEOUT then
begin
gop.Terminate;
end;
или вот так:
Код:
 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() должен быть в теле потока? если да, то где именно? и
в каким образом?
Оба случая некорректны: если у потока TThread выставлен флаг FreeOnTerminated := True, то после Resume нельзя обращаться к объекту потока, т.к. его теоретически уже может и не быть.

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

Kmet

Java Team
25.05.2006
1 036
8
#17
в двух приведенных случаях не работает...
Как именно не работает? :)
может быть проблема в том, что
поток создаётся на основе класса TThread а не функцие CreateThread()?
вряд ли, TThread всего лишь wrapper, хотя в делфи я не специалист

и если ждат в основной программе, то она подвисает по моему на время таймаута....
Ну можно и так сказать. Давай ты лучше раскажешь чтто именно тебе надо реализовать
 
R

ronik

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

ronik

#19
Оба случая некорректны: если у потока TThread выставлен флаг FreeOnTerminated := True, то после Resume нельзя обращаться к объекту потока, т.к. его теоретически уже может и не быть.
спасибо... понятно...
Пробуй использовать TerminateThread
уже пробывал... эффект тот же... только памяти приложение больше ест... )
 
S

Shurik Ilyin

#20
Код:
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 на проверку компьютера в сети и протестируй.
 
Статус
Закрыто для дальнейших ответов.