Patron Singleton

28/08/2006 - 17:02 por BassXpander | Informe spam
Hola a todos!!

Tengo una aplicación windows. Necesito que cuando se ejecute,
verifique primero si ya existe una instancia ejecutandose, sino, se
cree una nueva.

Se que esta funcionalidad se puede lograr implementanto el patron
singleton. He buscado en la red y he encontrado información pero para
dos formularios (Formulario A abre a formulario B creando una sola
instancia).

Mi problema es que yo solamente tengo un formulario y no se como
aplicar el patron singleton.


Alguien puede ayudarme?

Gracias

Preguntas similare

Leer las respuestas

#1 Jorge Serrano [MVP VB]
28/08/2006 - 17:29 | Informe spam
¿Es para VB 2005?.

Si es así, en las propiedades del proyecto hay un check que te permite
indicar que la aplicación sea singleton.


Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Blog de Jorge Serrano
http://geeks.ms/blogs/jorge/default.aspx


"BassXpander" wrote:

Hola a todos!!

Tengo una aplicación windows. Necesito que cuando se ejecute,
verifique primero si ya existe una instancia ejecutandose, sino, se
cree una nueva.

Se que esta funcionalidad se puede lograr implementanto el patron
singleton. He buscado en la red y he encontrado información pero para
dos formularios (Formulario A abre a formulario B creando una sola
instancia).

Mi problema es que yo solamente tengo un formulario y no se como
aplicar el patron singleton.


Alguien puede ayudarme?

Gracias


Respuesta Responder a este mensaje
#2 Angel. E. Ruiz. P
28/08/2006 - 17:40 | Informe spam
Si es VS 2003 puedes ver este articulo:
El Patrón Singleton
http://www.microsoft.com/spanish/ms...J_4081.asp

Saludos cordiales,
Ángel Ruiz
MCP C#
MVP de Visual Basic desde 2004
Caracas - Venezuela
"El conocimiento es un bien, que crece a medida que se comparte"
"BassXpander" escribió en el mensaje
news:
Hola a todos!!

Tengo una aplicación windows. Necesito que cuando se ejecute,
verifique primero si ya existe una instancia ejecutandose, sino, se
cree una nueva.

Se que esta funcionalidad se puede lograr implementanto el patron
singleton. He buscado en la red y he encontrado información pero para
dos formularios (Formulario A abre a formulario B creando una sola
instancia).

Mi problema es que yo solamente tengo un formulario y no se como
aplicar el patron singleton.


Alguien puede ayudarme?

Gracias
Respuesta Responder a este mensaje
#3 BassXpander
28/08/2006 - 18:11 | Informe spam
Gracias por sus respuestas, he revisado el link de referencia que me
dieron.

Es para Vss 2003. He estado revisando y hasta donde alcanzo a
visualizar, el patron singleton usa una variable compartida ( shared en
vb ) la cual se emplea como flag para determinar si existe ya una
instancia ejecutandose.

A diferencia de los formularios MDI, donde el formulario padre puede
contener esa variable y los formularios hijos consultan dicha variable,
al tener un unico formulario, cada que la aplicación entra en el
procedimiento sub Main, define una nueva variable, por lo que siempre
tendra como valor nothing y como consecuencia hace una nueva instancia.

En codigo esto es :

Module Module1

Public mInstance As Form1
Public _Form1 As Form1
Public x As Form1

Sub main()

x = GetInstance()
x.ShowDialog()

End Sub


Public Function GetInstance() As Form1

If _Form1 Is Nothing Then
_Form1 = New Form1
End If

Return _Form1

End Function

End Module


Es correcto lo que digo? y si es asi, hay alguna manera de
solucionarlo?

Gracias
Respuesta Responder a este mensaje
#4 Angel. E. Ruiz. P
28/08/2006 - 19:58 | Informe spam
Si es una sola ventana usa:


#Region " Para saber si una aplicación está en memoria "
'
<System.Runtime.InteropServices.DllImport("user32.dll", _
EntryPoint:="SetForegroundWindow")> _
Public Function SetForegroundWindow( _
ByVal hWnd As IntPtr) As Boolean
End Function
'
'
<System.Runtime.InteropServices.DllImport("user32.dll", _
EntryPoint:="FindWindow")> _
Public Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function
'
Public ceroIntPtr As New IntPtr(0)
'
'
#End Region
Para usarla, declarar este módulo Sub Main dentro del código de la clase del
formulario, habrá que indicar tanto el texto de la barra de título como el
nombre de la clase (el nombre del formulario).




Public Shared Sub Main()
' Se comprueba si la aplicación está en memoria
Dim nWnd As IntPtr
'
nWnd = FindWindow(Nothing, "Form1")
If nWnd.Equals(ceroIntPtr) Then
' Si no está, se carga la actual
Application.Run(New Form1())
Else
' Si ya está, se activa
SetForegroundWindow(nWnd)
' y se sale de la actual
Application.Exit()
End If
End Sub
Saludos cordiales,Ángel RuizMCP C#MVP de Visual Basic desde 2004Caracas -
Venezuela"El conocimiento es un bien, que crece a medida que se comparte""BassXpander"
escribió en el mensaje
news:
Gracias por sus respuestas, he revisado el link de referencia que me
dieron.

Es para Vss 2003. He estado revisando y hasta donde alcanzo a
visualizar, el patron singleton usa una variable compartida ( shared en
vb ) la cual se emplea como flag para determinar si existe ya una
instancia ejecutandose.

A diferencia de los formularios MDI, donde el formulario padre puede
contener esa variable y los formularios hijos consultan dicha variable,
al tener un unico formulario, cada que la aplicación entra en el
procedimiento sub Main, define una nueva variable, por lo que siempre
tendra como valor nothing y como consecuencia hace una nueva instancia.

En codigo esto es :

Module Module1

Public mInstance As Form1
Public _Form1 As Form1
Public x As Form1

Sub main()

x = GetInstance()
x.ShowDialog()

End Sub


Public Function GetInstance() As Form1

If _Form1 Is Nothing Then
_Form1 = New Form1
End If

Return _Form1

End Function

End Module


Es correcto lo que digo? y si es asi, hay alguna manera de
solucionarlo?

Gracias
Respuesta Responder a este mensaje
#5 Carlos Gómez
28/08/2006 - 20:29 | Informe spam
http://www.dofactory.com/Patterns/P...leton.aspx

// Singleton pattern -- Structural example

using System;

namespace DoFactory.GangOfFour.Singleton.Structural
{

// MainApp test application

class MainApp
{

static void Main()
{
// Constructor is protected -- cannot use new
Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance();

if (s1 == s2)
{
Console.WriteLine("Objects are the same instance");
}

// Wait for user
Console.Read();
}
}

// "Singleton"

class Singleton
{
private static Singleton instance;

// Note: Constructor is 'protected'
protected Singleton()
{
}

public static Singleton Instance()
{
// Use 'Lazy initialization'
if (instance == null)
{
instance = new Singleton();
}

return instance;
}
}
}

Output
Objects are the same instance
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida