小编Jer*_*nes的帖子

如何使用MS Visual Studio进行Android开发?

你可以使用Visual Studio for Android开发吗?

如果是这样,您将如何设置android SDK而不是.NET框架,是否有任何特殊设置或配置?

android visual-studio

253
推荐指数
9
解决办法
32万
查看次数

ACE vs Boost vs Poco vs wxWidgets

我在ACE,BoostwxWidgets方面拥有丰富的经验.我最近找到了POCO库.有没有人对它们有任何经验,以及它们在性能和可靠性方面与ACE,Boost和wxWidgets相比如何?

我特别感兴趣用POCO取代ACE.我无法让ACE使用带有x64目标的VS2008进行编译.我主要使用ACE_Task,所以我认为我可以用Poco的线程和消息队列替换它们.

我感兴趣的POCO的其他部分是HTTPServer,HTTPClient和LayeredConfiguration.这些库与Boost和wxWidgets中的库类似,但我尝试将wxWidgets的使用限制为GUI组件,而类似的Boost库则很难.

我对任何人可以分享关于POCO的任何经验感兴趣,无论好坏.

c++ boost ace poco-libraries

17
推荐指数
2
解决办法
1万
查看次数

使用更长的CommandText来降低SqlCommand的性能

SqlCommand的CommandText的长度是否有所不同?我也不是在谈论成千上万的角色.这就是我所拥有的:

SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sql;

for (int i=0; i<1000; ++i)
{
    string name = i.ToString() + "Bob" + i.ToString();
    string email = i.ToString() + "Jim" + i.ToString();
    // etc...

    cmd.Parameters.Clear();
    cmd.Parameters.Add(new SqlParameter("@name", name));
    cmd.Parameters.Add(new SqlParameter("@country", country));

    DateTime cmdStart = DateTime.Now;
    cmd.ExecuteNonQuery();
    DateTime cmdEnd = DateTime.Now;
    TimeSpan len = cmdEnd - cmdStart;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用以下sql,第一次迭代需要0.5秒.第二个需要1.1秒.第三个需要3.3秒.等等,直到它只是暂停超时.

string sql =
    "INSERT INTO Test " +
    "           ([name] " +
    "           ,[email] " +
    "           ,[country] " + …
Run Code Online (Sandbox Code Playgroud)

c# sql-server

6
推荐指数
1
解决办法
3934
查看次数

如何重载运算符<<不接受或返回ostream

原始问题

我正在编写一个日志类,其目标是能够执行此操作:

// thread one
Logger() << "Some string" << std::ios::hex << 45;
// thread two
Logger() << L"Some wide string" << std::endl;
Run Code Online (Sandbox Code Playgroud)

目前我的Logger标题看起来像这样:

#pragma once;
#include <ostream>    
class Logger
{
public:
    Logger();
    ~Logger();

    std::ostream* out_stream;
};

template <typename T>
Logger& operator<< (Logger& logger, T thing) {
    *logger.out_stream << thing;
    return logger;
}
Run Code Online (Sandbox Code Playgroud)

关于这门课的一些注意事项

  1. 跨平台兼容性不是问题.
  2. 在Logger.cpp里面有一个单例类,负责创建"真正的"ostream.
  3. Logger构造函数和解构函数执行单例的必要锁定.

我有三个问题:

  • 如何使operator << function成为朋友或成员,以便将out_stream设置为私有?
  • 如何使操作符<<函数适用于操纵器?
  • 我如何添加一个特化,以便如果T是WCHAR*或std :: wstring,它会在将它传递给out_stream之前将其转换为char*或std :: string?(我可以进行转换.在我的情况下,丢失高的unicode字符不是问题.)

在答案中学到的东西总结:

  • 把模板放在朋友之前而不是之后.
  • std :: ios :: hex不是操纵者.std :: hex是一个操纵器.

最终结果

#pragma once
#include …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading

5
推荐指数
1
解决办法
5391
查看次数

如何在minidump中更改模块的校验和?

我编写(和销售)的软件在分发之前已经过压缩和加密.每次我发布一个新版本时,我会保留所有的.map文件和生成的二进制文件,包括压缩和加密之前的exe文件.

当它在客户端的机器上崩溃时,我会得到一个minidump.我在Visual Studio中打开这些minidump并在那里探索它们.

我通过在.map文件中搜索地址来充分利用这些小型转储.这通常会让我进入代码的正确区域,我通常可以解释为什么崩溃发生并修复它,但这非常耗时.

如果我可以在minidump的调试中使用我从原始构建中保存的符号,将会很有帮助.

我的问题是我收到有关无法找到正确符号的警告.我的研究让我相信这是因为客户机上的exe的校验和与Visual Studio构建的exe的校验和不匹配.我理解为什么,它已被压缩和加密.当然校验和不匹配.

我想我可以手动编辑minidump或更改已保存二进制文件的校验和以匹配可分发的校验和.我宁愿操纵存储的副本,所以我不必修改进来的每个转储,但我会对其中任何一个进行修改.

所以,我的问题是:我如何找到这些校验和并弄清楚我应该用它们替换它们?作为辅助问题:有更好的方法吗?

c++ debugging crash-dumps

5
推荐指数
1
解决办法
1429
查看次数

哪个SQL查询更好?

这是SQL查询语句:

SELECT p.id, p.[name], SUM(ps.sales_amount) AS GROSS_SALES
FROM products p
  LEFT OUTER JOIN product_sales ps ON p.id = ps.product_id
GROUP BY p.id, p.[name]
Run Code Online (Sandbox Code Playgroud)

优于:

SELECT SUM([t2].[value]) AS [SalesAmount], [t2].[id] AS [ProductId], [t2].[name] AS [ProductName]
FROM (
    SELECT (
        SELECT SUM([t1].[sales_amount])
        FROM [dbo].[product_sales] AS [t1]
        WHERE [t1].[product_id] = [t0].[id]
        ) AS [value], [t0].[id], [t0].[name]
    FROM [dbo].[products] AS [t0]
    ) AS [t2]
GROUP BY [t2].[id], [t2].[name]
Run Code Online (Sandbox Code Playgroud)

第二个是LINQ2SQL查询的结果.仍在寻找重写LINQ表达式的方法......

该示例中最优化的SQL查询是什么?

你的意见?谢谢!

sql database sql-server-2005 linq-to-sql

5
推荐指数
1
解决办法
202
查看次数

如何跨进程边界编组进程外COM引用?

我有一个进程外的COM服务器,需要密切关注事物.此服务器作为服务运行,并且在内部是单例.为简单起见,我会称他为BossCom.

我有另一个进程外COM服务器,它是一个工作者.对于系统稳定性而言,它是一次性服务器(意味着如果您创建2个WorkerCom,则有2个WorkerCom.exe正在运行).为简单起见,我会称他为WorkerCom.

WorkerCom可以通过任何东西启动,即使有人通过命令行使用正确的命令行参数运行他也可以启动它.

总体目标是让BossCom知道什么是WorkerComs,知道他们在做什么,并能够给他们订单(暂停,停止,加速等).

我最初的想法是,每当WorkerCom启动时,他都会CoCreateInstance一个BossCom并调用BossCom-> RegisterWorker(IUnknown me).然后当WorkerCom即将关闭时,他会调用BossCom-> UnregisterWorker(IUnknown me).BossCom可以为IWorkerCom查询IUnknown,并能够发出命令.

如果所有这些com对象都在同一个进程中,那将会很有效,但它们不是.我想过使用GlobalInterfaceTable,但它只是单个进程意义上的全局.

我花了几天时间研究这个并且不知所措.也许我是隧道视野.

如何编组从Worker到Boss的com对象的引用?

哦,而且,值得一提的是,BossCom是用C#编写的,而WorkerCom是用ATL C++编写的,但我会用VB,Scala,Lisp等编写的解决方案.我想我可以翻译核心理念.:-)

c# c++ com interprocess

5
推荐指数
1
解决办法
1748
查看次数

最好的Linq2Sql相当于IsNull(Max(id))

我想将以下SQL转换为Linq2SQL.

select isnull(max(Id),0) from tbl
Run Code Online (Sandbox Code Playgroud)

即使我将Id定义为 Int NOT NULL

我希望能够将defult值设为0,即使表中没有行也是如此.

我能够提出的最佳可读方法是

var maxId = dc.tbl.Select(row => row.Id)
                  .ToArray().Union(Enumerable.Range(0, 1)).Max();
Run Code Online (Sandbox Code Playgroud)

但是这种方法需要降低所有数据,性能更高但可读性更低

var maxId = dc.tbl.Select(row => row.Id)
                  .OrderByDescending(ii => ii).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

.net sql linq-to-sql

4
推荐指数
1
解决办法
1374
查看次数

通缉:优雅的竞争条件解决方案

我有以下代码:

class TimeOutException
{};

template <typename T>
class MultiThreadedBuffer
{
public:
    MultiThreadedBuffer()
    {
        InitializeCriticalSection(&m_csBuffer);
        m_evtDataAvail = CreateEvent(NULL, TRUE, FALSE, NULL);
    }
    ~MultiThreadedBuffer()
    {
        CloseHandle(m_evtDataAvail);
        DeleteCriticalSection(&m_csBuffer);
    }
    void LockBuffer()
    {
        EnterCriticalSection(&m_csBuffer);
    }
    void UnlockBuffer()
    {
        LeaveCriticalSection(&m_csBuffer);
    }
    void Add(T val)
    {
        LockBuffer();
        m_buffer.push_back(val);
        SetEvent(m_evtDataAvail);
        UnlockBuffer();
    }
    T Get(DWORD timeout)
    {
        T val;
        if (WaitForSingleObject(m_evtDataAvail, timeout) == WAIT_OBJECT_0) {
            LockBuffer();

            if (!m_buffer.empty()) {
                val = m_buffer.front();
                m_buffer.pop_front();
            }

            if (m_buffer.empty()) {
                ResetEvent(m_evtDataAvail);
            }

            UnlockBuffer();
        } else {
            throw TimeOutException();
        }
        return val; …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading

3
推荐指数
2
解决办法
515
查看次数