当前位置:编程学习 > C#/ASP.NET >>

100分求助:服务器上画面间控制问题

C#开发桌面应用程序遇到的问题:
1,程序在服务器上运行,环境为windows 2003 server。
2,多用户通过远程连接访问服务器,运行程序。
3,A用户运行该程序,打开画面1。
4,B用户运行该程序,如果画面1已经被打开,则B用户不能再打开画面1。
问题:
B用户如何判断A用户已经打开画面1。
要求:
给出具体的关键代码。
--------------------编程问答-------------------- 这样的话,可以在服务器上给每个登录进来的用户开辟个单独的账号啊 --------------------编程问答-------------------- 应该是a打开画面1以后广播一下,说“画面1已经打开了”。b听到“大喇叭”喊了,就不要让b有打开画面1的权限了 --------------------编程问答-------------------- 存到数据库 --------------------编程问答-------------------- 顶
--------------------编程问答-------------------- 1,这样的话,可以在服务器上给每个登录进来的用户开辟个单独的账号啊
⇒客户不允许

2,应该是a打开画面1以后广播一下,说“画面1已经打开了”。b听到“大喇叭”喊了,就不要让b有打开画面1的权限了
⇒具体的实现方法?

3,存到数据库
⇒程序服务器和数据库服务器不在一块,2者之间断网时怎么样把数据库里的访问数据清空? --------------------编程问答--------------------
引用 3 楼 yuangang1011 的回复:
存到数据库

当然,如果不想使用广播,把那啥库存了,每次客户端执行时去查查库存也行哈。慢点。 --------------------编程问答-------------------- 可以用数据库标记下啊 T打开 F关闭 
默认为F 
a打开了就标记未T 
只有F才能打开,b进去就不能打开 --------------------编程问答-------------------- 我觉得用数据库比较好!设置一个标志位flag ,0 关闭 默认 1打开, 当画面1打开时让flag=1 下次判断一下!!

至于你说的:程序服务器和数据库服务器不在一块,2者之间断网时怎么样把数据库里的访问数据清空?

不太理解!
--------------------编程问答-------------------- 数据库方式不采用,请大家给点其他方面的意见吧 --------------------编程问答--------------------
引用 5 楼 yuyuwar 的回复:
1,这样的话,可以在服务器上给每个登录进来的用户开辟个单独的账号啊 
⇒客户不允许 

2,应该是a打开画面1以后广播一下,说“画面1已经打开了”。b听到“大喇叭”喊了,就不要让b有打开画面1的权限了 
⇒具体的实现方法? 

3,存到数据库 
⇒程序服务器和数据库服务器不在一块,2者之间断网时怎么样把数据库里的访问数据清空?

回答关于问题2
客户端a发打开画面1的CMD给服务器,服务器收到CMD执行打开画面1的操作,同时对每一个客户端回复CMD提示画面1已经打开。每个客户端收到服务器发来的CMD都执行不再有权限打开画面1的操作。。。 --------------------编程问答-------------------- 楼主,没有太明白你的意思!不过如果是打开一个窗体后,要求禁止别人再打开的话可以用"互斥体"这个概念.
eg:
using System.Threading;(引用一下)

Mutex mutex = new Mutex(false, "ThisShouldOnlyRunOnce");
//判断互斥体是否使用中。
bool Running = !mutex.WaitOne(0, false);
if (! Running)
   Application.Run(new A画面());
else
   MessageBox.Show("A画面已经启动!");

不知道你所谓的画面是不是个窗体. --------------------编程问答-------------------- 再加点说明,
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName); // 获得已运行的相同程序的列表
foreach (Process process in processes)
{
    if (process.Id != current.Id && process.SessionId != current.SessionId)
    { // 如果不同Id不同SessionId则检查该进程里有没有已打开的画面A
      // ????????? 问题点:关键部分不知道该怎么找到画面A
    }
}

如果有其他解决方案,请详述 --------------------编程问答-------------------- 网络开发就是要CMD --------------------编程问答-------------------- 考虑下,IE被用户关闭,或者把网络拔掉,或者报错的情况下,B怎么办? --------------------编程问答-------------------- 我的想法是:可以在数据库或服务器的文件中设置一个标志,如果某个画面已经被打开,则将这个标志设为true,这时其他用户不能打开;定时查检这个画面是否还被打开,如果已经关闭,或这个画面超过一定时间没有被使用过,就将标志设置为false,这样其他用户就可以使用这个画面了。 --------------------编程问答-------------------- 就没有更详细点的回答了吗 --------------------编程问答-------------------- 可以考虑在服务器上存到一个集合里,比如可以建个类,里面提供一些访问方法,让客户端知道画面是否打开.如果你是用TCP/IP连接,可以在链接断开时将打开画面标记为"FALSE";如果是用UDP链接,可以在客户端定时给服务器发个信号,告诉服务器我还在用,超过一定时间视为断开.上面说的是意外情况,正常情况下,只要在客户关闭画面时给服务器发个信号就成.
不建议把标记存到数据里,如果打开的客户意外断开或关闭,那不就会造成别的用户无法打开了么
大概思路是这样,具体代码要自己写,软件的情况还是你最了解
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,