我TcpListener上课,我正在async/await阅读和写作.
对于这个服务器,我创建了单个数据库实例,我准备了所有数据库查询.
但是对于一个以上,TcpClient我一直在例外:
MySql.Data.MySqlClient.MySqlException发生了类型的异常,MySql.Data.dll但未在用户代码中处理附加信息:已经有一个
DataReader与此相关的开放Connection,必须先关闭.
如果我理解正确的话,那么一次数据库查询就不会超过一个async客户端.
所以我只是在我的查询中添加了锁,这样一切似乎都很好.
// One MySqlConnection instance for whole program.
lock (thisLock)
{
var cmd = connection.CreateCommand();
cmd.CommandText = "SELECT Count(*) FROM logins WHERE username = @user AND password = @pass";
cmd.Parameters.AddWithValue("@user", username);
cmd.Parameters.AddWithValue("@pass", password);
var count = int.Parse(cmd.ExecuteScalar().ToString());
return count > 0;
}
Run Code Online (Sandbox Code Playgroud)
我也尝试使用这个方法为每个查询创建新连接,如SO社区的某个人所提到的,但这个方法比锁慢得多:
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open(); // This takes +- 35ms and makes worse …Run Code Online (Sandbox Code Playgroud) 从这里看来,C不支持默认参数.
我在导出的库中有以下方法:
extern "C"
{
__declspec (dllexport) uintptr_t Method(int freq, int *pRetval, bool *support2MHz);
}
Run Code Online (Sandbox Code Playgroud)
如果我使最后一个参数可选像这样:
extern "C"
{
__declspec (dllexport) uintptr_t Method(int freq, int *pRetval, bool *support2MHz = NULL);
}
Run Code Online (Sandbox Code Playgroud)
我的dll仍在编译中.我的问题是为什么?每个人都说C代码不支持默认参数.
我使用C++ for MS 2015.
我需要在我的应用程序包安装中被动安装 Python,所以我使用以下内容:
python-3.5.4-amd64.exe /passive PrependPath=1
Run Code Online (Sandbox Code Playgroud)
根据这个:3.1.4。在没有 UI 的情况下安装我使用 PrependPath 参数,该参数应该将路径添加到 Windows 环境变量中的 Path 中。
但它似乎不起作用。变量不会发生任何变化。
如果我手动开始安装并选择或取消选择添加到路径的复选框,那么一切正常。
在修改当前安装时也与清除安装相同。不幸的是,我没有其他装有 Win 10 Pro 的 PC 来测试它。
我也用 Python 3.6.3 尝试过,结果相同。
编辑:
还尝试使用 PowerShellStart-Process python-3.5.4-amd64.exe -ArgumentList /passive , PretendPath=1获得相同的结果。
也在多台装有 Windows 10 的 PC 上进行了测试,结果相同,所以问题不仅仅出现在单台 PC 上
编辑: 当然,所有尝试都以管理员身份运行。
正如我在标题中提到的。我该怎么做?
class Main(QWidget):
def __init__(self):
super().__init__()
def StartButtonEvent(self):
self.test = ExecuteThread()
self.test.start()
def MyEvent(self):
#MainThreadGUI
class ExecuteThread(QThread):
def run(self):
# A lot of work
# Signal to main thread about finishing of job = mainthread will perform MyEvent
Run Code Online (Sandbox Code Playgroud)
我在这里找到了一些教程pyqt4在线程中向主线程的插槽中发射信号
但是似乎在PyQt5中不起作用:/
在Python中使用多处理时,我通常会看到一些示例,其中join()函数在一个单独的循环中调用,以实际创建每个进程.
例如,这个:
processes = []
for i in range(10):
p = Process(target=my_func)
processes.append(p)
p.start()
for p in processes:
p.join()
Run Code Online (Sandbox Code Playgroud)
比这更常见:
processes = []
for i in range(10):
p = Process(target=my_func)
processes.append(p)
p.start()
p.join()
Run Code Online (Sandbox Code Playgroud)
但是根据我的理解join(),它只是告诉脚本在该过程完成之前不要退出.因此,join()调用何时无关紧要.那么为什么通常在一个单独的循环中调用呢?
我想问你为什么我的方法StartReading没有被触发?我期待在控制台中"测试"文本,但没有出现.
public class Connection
{
public List<byte[]> ReadBuffer = new List<byte[]>();
TcpClient ClientLogin;
NetworkStream StreamLogin;
DataEncoder NetworkBufferLogin;
Thread ReadingThread;
public Connection()
{
ClientLogin = new TcpClient("127.0.0.1", 13000);
StreamLogin = ClientLogin.GetStream();
NetworkBufferLogin = new DataEncoder(StreamLogin);
ReadingThread = new Thread(StartReading);
}
private void StartReading()
{
while (true)
{
Console.WriteLine("test");
byte[] a = NetworkBufferLogin.ReceiveData();
ReadBuffer.Add(a);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和简单的呼唤
class Program
{
static void Main(string[] args)
{
Connection test = new Connection();
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud) python ×3
c# ×2
ado.net ×1
arguments ×1
async-await ×1
c ×1
c++ ×1
connection ×1
extern ×1
installation ×1
mysql ×1
pyqt5 ×1
windows ×1
windows-10 ×1